//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_spi(SotoInternal) import SotoCore

extension Resiliencehub {
    // MARK: Enums

    public enum AlarmType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case canary = "Canary"
        case composite = "Composite"
        case event = "Event"
        case logs = "Logs"
        case metric = "Metric"
        public var description: String { return self.rawValue }
    }

    public enum AppAssessmentScheduleType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case daily = "Daily"
        case disabled = "Disabled"
        public var description: String { return self.rawValue }
    }

    public enum AppComplianceStatusType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case changesDetected = "ChangesDetected"
        case missingPolicy = "MissingPolicy"
        case notApplicable = "NotApplicable"
        case notAssessed = "NotAssessed"
        case policyBreached = "PolicyBreached"
        case policyMet = "PolicyMet"
        public var description: String { return self.rawValue }
    }

    public enum AppDriftStatusType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case detected = "Detected"
        case notChecked = "NotChecked"
        case notDetected = "NotDetected"
        public var description: String { return self.rawValue }
    }

    public enum AppStatusType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case active = "Active"
        case deleting = "Deleting"
        public var description: String { return self.rawValue }
    }

    public enum AssessmentInvoker: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case system = "System"
        case user = "User"
        public var description: String { return self.rawValue }
    }

    public enum AssessmentStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case inprogress = "InProgress"
        case pending = "Pending"
        case success = "Success"
        public var description: String { return self.rawValue }
    }

    public enum ComplianceStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case missingPolicy = "MissingPolicy"
        case notApplicable = "NotApplicable"
        case policyBreached = "PolicyBreached"
        case policyMet = "PolicyMet"
        public var description: String { return self.rawValue }
    }

    public enum ConditionOperatorType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case equals = "Equals"
        case greaterOrEquals = "GreaterOrEquals"
        case greaterThen = "GreaterThen"
        case lessOrEquals = "LessOrEquals"
        case lessThen = "LessThen"
        case notEquals = "NotEquals"
        public var description: String { return self.rawValue }
    }

    public enum ConfigRecommendationOptimizationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case bestAttainable = "BestAttainable"
        case bestAzRecovery = "BestAZRecovery"
        case bestRegionRecovery = "BestRegionRecovery"
        case leastChange = "LeastChange"
        case leastCost = "LeastCost"
        case leastErrors = "LeastErrors"
        public var description: String { return self.rawValue }
    }

    public enum CostFrequency: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case daily = "Daily"
        case hourly = "Hourly"
        case monthly = "Monthly"
        case yearly = "Yearly"
        public var description: String { return self.rawValue }
    }

    public enum DataLocationConstraint: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case anyLocation = "AnyLocation"
        case sameContinent = "SameContinent"
        case sameCountry = "SameCountry"
        public var description: String { return self.rawValue }
    }

    public enum DifferenceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case added = "Added"
        case notEqual = "NotEqual"
        case removed = "Removed"
        public var description: String { return self.rawValue }
    }

    public enum DisruptionType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case az = "AZ"
        case hardware = "Hardware"
        case region = "Region"
        case software = "Software"
        public var description: String { return self.rawValue }
    }

    public enum DriftStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case detected = "Detected"
        case notChecked = "NotChecked"
        case notDetected = "NotDetected"
        public var description: String { return self.rawValue }
    }

    public enum DriftType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case appComponentResiliencyComplianceStatus = "AppComponentResiliencyComplianceStatus"
        case applicationCompliance = "ApplicationCompliance"
        public var description: String { return self.rawValue }
    }

    public enum EstimatedCostTier: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case l1 = "L1"
        case l2 = "L2"
        case l3 = "L3"
        case l4 = "L4"
        public var description: String { return self.rawValue }
    }

    public enum EventType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case driftDetected = "DriftDetected"
        case scheduledAssessmentFailure = "ScheduledAssessmentFailure"
        public var description: String { return self.rawValue }
    }

    public enum ExcludeRecommendationReason: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case alreadyImplemented = "AlreadyImplemented"
        case complexityOfImplementation = "ComplexityOfImplementation"
        case notRelevant = "NotRelevant"
        public var description: String { return self.rawValue }
    }

    public enum FieldAggregationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case avg = "Avg"
        case count = "Count"
        case max = "Max"
        case min = "Min"
        case sum = "Sum"
        public var description: String { return self.rawValue }
    }

    public enum GroupingRecommendationConfidenceLevel: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case high = "High"
        case medium = "Medium"
        public var description: String { return self.rawValue }
    }

    public enum GroupingRecommendationRejectionReason: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case distinctBusinessPurpose = "DistinctBusinessPurpose"
        case distinctUserGroupHandling = "DistinctUserGroupHandling"
        case other = "Other"
        case separateDataConcern = "SeparateDataConcern"
        public var description: String { return self.rawValue }
    }

    public enum GroupingRecommendationStatusType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case accepted = "Accepted"
        case pendingDecision = "PendingDecision"
        case rejected = "Rejected"
        public var description: String { return self.rawValue }
    }

    public enum HaArchitecture: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case backupAndRestore = "BackupAndRestore"
        case multiSite = "MultiSite"
        case noRecoveryPlan = "NoRecoveryPlan"
        case pilotLight = "PilotLight"
        case warmStandby = "WarmStandby"
        public var description: String { return self.rawValue }
    }

    public enum MetricsExportStatusType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case inProgress = "InProgress"
        case pending = "Pending"
        case success = "Success"
        public var description: String { return self.rawValue }
    }

    public enum PermissionModelType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case legacyIamUser = "LegacyIAMUser"
        case roleBased = "RoleBased"
        public var description: String { return self.rawValue }
    }

    public enum PhysicalIdentifierType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case arn = "Arn"
        case native = "Native"
        public var description: String { return self.rawValue }
    }

    public enum RecommendationComplianceStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case breachedCanMeet = "BreachedCanMeet"
        case breachedUnattainable = "BreachedUnattainable"
        case metCanImprove = "MetCanImprove"
        case missingPolicy = "MissingPolicy"
        public var description: String { return self.rawValue }
    }

    public enum RecommendationStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case excluded = "Excluded"
        case implemented = "Implemented"
        case inactive = "Inactive"
        case notImplemented = "NotImplemented"
        public var description: String { return self.rawValue }
    }

    public enum RecommendationTemplateStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case inProgress = "InProgress"
        case pending = "Pending"
        case success = "Success"
        public var description: String { return self.rawValue }
    }

    public enum RenderRecommendationType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case alarm = "Alarm"
        case sop = "Sop"
        case test = "Test"
        public var description: String { return self.rawValue }
    }

    public enum ResiliencyPolicyTier: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case coreServices = "CoreServices"
        case critical = "Critical"
        case important = "Important"
        case missionCritical = "MissionCritical"
        case nonCritical = "NonCritical"
        case notApplicable = "NotApplicable"
        public var description: String { return self.rawValue }
    }

    public enum ResiliencyScoreType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case alarm = "Alarm"
        case compliance = "Compliance"
        case sop = "Sop"
        case test = "Test"
        public var description: String { return self.rawValue }
    }

    public enum ResourceImportStatusType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case inProgress = "InProgress"
        case pending = "Pending"
        case success = "Success"
        public var description: String { return self.rawValue }
    }

    public enum ResourceImportStrategyType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case addOnly = "AddOnly"
        case replaceAll = "ReplaceAll"
        public var description: String { return self.rawValue }
    }

    public enum ResourceMappingType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case appRegistryApp = "AppRegistryApp"
        case cfnStack = "CfnStack"
        case eks = "EKS"
        case resource = "Resource"
        case resourceGroup = "ResourceGroup"
        case terraform = "Terraform"
        public var description: String { return self.rawValue }
    }

    public enum ResourceResolutionStatusType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case inProgress = "InProgress"
        case pending = "Pending"
        case success = "Success"
        public var description: String { return self.rawValue }
    }

    public enum ResourceSourceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case appTemplate = "AppTemplate"
        case discovered = "Discovered"
        public var description: String { return self.rawValue }
    }

    public enum ResourcesGroupingRecGenStatusType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "Failed"
        case inProgress = "InProgress"
        case pending = "Pending"
        case success = "Success"
        public var description: String { return self.rawValue }
    }

    public enum SopServiceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case ssm = "SSM"
        public var description: String { return self.rawValue }
    }

    public enum TemplateFormat: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cfnJson = "CfnJson"
        case cfnYaml = "CfnYaml"
        public var description: String { return self.rawValue }
    }

    public enum TestRisk: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case high = "High"
        case medium = "Medium"
        case small = "Small"
        public var description: String { return self.rawValue }
    }

    public enum TestType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case az = "AZ"
        case hardware = "Hardware"
        case region = "Region"
        case software = "Software"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct AcceptGroupingRecommendationEntry: AWSEncodableShape {
        /// Indicates the identifier of the grouping recommendation.
        public let groupingRecommendationId: String

        @inlinable
        public init(groupingRecommendationId: String) {
            self.groupingRecommendationId = groupingRecommendationId
        }

        public func validate(name: String) throws {
            try self.validate(self.groupingRecommendationId, name: "groupingRecommendationId", parent: name, max: 255)
            try self.validate(self.groupingRecommendationId, name: "groupingRecommendationId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case groupingRecommendationId = "groupingRecommendationId"
        }
    }

    public struct AcceptResourceGroupingRecommendationsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// List of resource grouping recommendations you want to include in your application.
        public let entries: [AcceptGroupingRecommendationEntry]

        @inlinable
        public init(appArn: String, entries: [AcceptGroupingRecommendationEntry]) {
            self.appArn = appArn
            self.entries = entries
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.entries.forEach {
                try $0.validate(name: "\(name).entries[]")
            }
            try self.validate(self.entries, name: "entries", parent: name, max: 30)
            try self.validate(self.entries, name: "entries", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case entries = "entries"
        }
    }

    public struct AcceptResourceGroupingRecommendationsResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// List of resource grouping recommendations that could not be included in your application.
        public let failedEntries: [FailedGroupingRecommendationEntry]

        @inlinable
        public init(appArn: String, failedEntries: [FailedGroupingRecommendationEntry]) {
            self.appArn = appArn
            self.failedEntries = failedEntries
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case failedEntries = "failedEntries"
        }
    }

    public struct AddDraftAppVersionResourceMappingsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Mappings used to map logical resources from the template to physical resources. You can use the mapping type CFN_STACK if the application template uses a logical stack name. Or you can map individual resources by using the mapping type RESOURCE. We recommend using the mapping type CFN_STACK if the application is backed by a CloudFormation stack.
        public let resourceMappings: [ResourceMapping]

        @inlinable
        public init(appArn: String, resourceMappings: [ResourceMapping]) {
            self.appArn = appArn
            self.resourceMappings = resourceMappings
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.resourceMappings.forEach {
                try $0.validate(name: "\(name).resourceMappings[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case resourceMappings = "resourceMappings"
        }
    }

    public struct AddDraftAppVersionResourceMappingsResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String
        /// List of sources that are used to map a logical resource from the template to a physical resource. You can use sources such as CloudFormation, Terraform state files, AppRegistry applications, or Amazon EKS.
        public let resourceMappings: [ResourceMapping]

        @inlinable
        public init(appArn: String, appVersion: String, resourceMappings: [ResourceMapping]) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.resourceMappings = resourceMappings
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case resourceMappings = "resourceMappings"
        }
    }

    public struct Alarm: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Amazon CloudWatch alarm.
        public let alarmArn: String?
        /// Indicates the source of the Amazon CloudWatch alarm. That is, it indicates if the alarm was created using Resilience Hub recommendation (AwsResilienceHub), or if you had created the alarm in Amazon CloudWatch (Customer).
        public let source: String?

        @inlinable
        public init(alarmArn: String? = nil, source: String? = nil) {
            self.alarmArn = alarmArn
            self.source = source
        }

        private enum CodingKeys: String, CodingKey {
            case alarmArn = "alarmArn"
            case source = "source"
        }
    }

    public struct AlarmRecommendation: AWSDecodableShape {
        /// Application Component name for the CloudWatch alarm recommendation. This name is saved as the first item in the appComponentNames list.
        public let appComponentName: String?
        /// List of Application Component names for the CloudWatch alarm recommendation.
        public let appComponentNames: [String]?
        /// Description of the alarm recommendation.
        public let description: String?
        /// List of CloudWatch alarm recommendations.
        public let items: [RecommendationItem]?
        /// Name of the alarm recommendation.
        public let name: String
        /// The prerequisite for the alarm recommendation.
        public let prerequisite: String?
        /// Identifier of the alarm recommendation.
        public let recommendationId: String
        /// Status of the recommended Amazon CloudWatch alarm.
        public let recommendationStatus: RecommendationStatus?
        /// Reference identifier of the alarm recommendation.
        public let referenceId: String
        /// Type of alarm recommendation.
        public let type: AlarmType

        @inlinable
        public init(appComponentNames: [String]? = nil, description: String? = nil, items: [RecommendationItem]? = nil, name: String, prerequisite: String? = nil, recommendationId: String, recommendationStatus: RecommendationStatus? = nil, referenceId: String, type: AlarmType) {
            self.appComponentName = nil
            self.appComponentNames = appComponentNames
            self.description = description
            self.items = items
            self.name = name
            self.prerequisite = prerequisite
            self.recommendationId = recommendationId
            self.recommendationStatus = recommendationStatus
            self.referenceId = referenceId
            self.type = type
        }

        @available(*, deprecated, message: "Members appComponentName have been deprecated")
        @inlinable
        public init(appComponentName: String? = nil, appComponentNames: [String]? = nil, description: String? = nil, items: [RecommendationItem]? = nil, name: String, prerequisite: String? = nil, recommendationId: String, recommendationStatus: RecommendationStatus? = nil, referenceId: String, type: AlarmType) {
            self.appComponentName = appComponentName
            self.appComponentNames = appComponentNames
            self.description = description
            self.items = items
            self.name = name
            self.prerequisite = prerequisite
            self.recommendationId = recommendationId
            self.recommendationStatus = recommendationStatus
            self.referenceId = referenceId
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case appComponentName = "appComponentName"
            case appComponentNames = "appComponentNames"
            case description = "description"
            case items = "items"
            case name = "name"
            case prerequisite = "prerequisite"
            case recommendationId = "recommendationId"
            case recommendationStatus = "recommendationStatus"
            case referenceId = "referenceId"
            case type = "type"
        }
    }

    public struct App: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Assessment execution schedule with 'Daily' or 'Disabled' values.
        public let assessmentSchedule: AppAssessmentScheduleType?
        /// Amazon Resource Name (ARN) of  Resource Groups group that is integrated with an AppRegistry application. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let awsApplicationArn: String?
        /// Current status of compliance for the resiliency policy.
        public let complianceStatus: AppComplianceStatusType?
        /// Date and time when the application was created.
        public let creationTime: Date
        /// Optional description for an application.
        public let description: String?
        /// Indicates if compliance drifts (deviations) were detected while running an assessment for your application.
        public let driftStatus: AppDriftStatusType?
        /// The list of events you would like to subscribe and get notification for. Currently, Resilience Hub supports notifications only for Drift detected and Scheduled assessment failure events.
        public let eventSubscriptions: [EventSubscription]?
        /// Date and time the most recent compliance evaluation.
        public let lastAppComplianceEvaluationTime: Date?
        /// Indicates the last time that a drift was evaluated.
        public let lastDriftEvaluationTime: Date?
        /// Date and time the most recent resiliency score evaluation.
        public let lastResiliencyScoreEvaluationTime: Date?
        /// Name for the application.
        public let name: String
        /// Defines the roles and credentials that Resilience Hub would use while creating the application, importing its resources, and running an assessment.
        public let permissionModel: PermissionModel?
        /// Amazon Resource Name (ARN) of the resiliency policy. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:resiliency-policy/policy-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let policyArn: String?
        /// Current resiliency score for the application.
        public let resiliencyScore: Double?
        /// Recovery Point Objective (RPO) in seconds.
        public let rpoInSecs: Int?
        /// Recovery Time Objective (RTO) in seconds.
        public let rtoInSecs: Int?
        /// Status of the application.
        public let status: AppStatusType?
        /// Tags assigned to the resource. A tag is a label that you assign to an Amazon Web Services resource.
        /// Each tag consists of a key/value pair.
        public let tags: [String: String]?

        @inlinable
        public init(appArn: String, assessmentSchedule: AppAssessmentScheduleType? = nil, awsApplicationArn: String? = nil, complianceStatus: AppComplianceStatusType? = nil, creationTime: Date, description: String? = nil, driftStatus: AppDriftStatusType? = nil, eventSubscriptions: [EventSubscription]? = nil, lastAppComplianceEvaluationTime: Date? = nil, lastDriftEvaluationTime: Date? = nil, lastResiliencyScoreEvaluationTime: Date? = nil, name: String, permissionModel: PermissionModel? = nil, policyArn: String? = nil, resiliencyScore: Double? = nil, rpoInSecs: Int? = nil, rtoInSecs: Int? = nil, status: AppStatusType? = nil, tags: [String: String]? = nil) {
            self.appArn = appArn
            self.assessmentSchedule = assessmentSchedule
            self.awsApplicationArn = awsApplicationArn
            self.complianceStatus = complianceStatus
            self.creationTime = creationTime
            self.description = description
            self.driftStatus = driftStatus
            self.eventSubscriptions = eventSubscriptions
            self.lastAppComplianceEvaluationTime = lastAppComplianceEvaluationTime
            self.lastDriftEvaluationTime = lastDriftEvaluationTime
            self.lastResiliencyScoreEvaluationTime = lastResiliencyScoreEvaluationTime
            self.name = name
            self.permissionModel = permissionModel
            self.policyArn = policyArn
            self.resiliencyScore = resiliencyScore
            self.rpoInSecs = rpoInSecs
            self.rtoInSecs = rtoInSecs
            self.status = status
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case assessmentSchedule = "assessmentSchedule"
            case awsApplicationArn = "awsApplicationArn"
            case complianceStatus = "complianceStatus"
            case creationTime = "creationTime"
            case description = "description"
            case driftStatus = "driftStatus"
            case eventSubscriptions = "eventSubscriptions"
            case lastAppComplianceEvaluationTime = "lastAppComplianceEvaluationTime"
            case lastDriftEvaluationTime = "lastDriftEvaluationTime"
            case lastResiliencyScoreEvaluationTime = "lastResiliencyScoreEvaluationTime"
            case name = "name"
            case permissionModel = "permissionModel"
            case policyArn = "policyArn"
            case resiliencyScore = "resiliencyScore"
            case rpoInSecs = "rpoInSecs"
            case rtoInSecs = "rtoInSecs"
            case status = "status"
            case tags = "tags"
        }
    }

    public struct AppAssessment: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String?
        /// Version of an application.
        public let appVersion: String?
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// Name of the assessment.
        public let assessmentName: String?
        /// Current status of the assessment for the resiliency policy.
        public let assessmentStatus: AssessmentStatus
        /// Application compliance against the resiliency policy.
        public let compliance: [DisruptionType: DisruptionCompliance]?
        /// Current status of the compliance for the resiliency policy.
        public let complianceStatus: ComplianceStatus?
        /// Cost for the application.
        public let cost: Cost?
        /// Indicates if compliance drifts (deviations) were detected while running an assessment for your application.
        public let driftStatus: DriftStatus?
        /// End time for the action.
        public let endTime: Date?
        /// The entity that invoked the assessment.
        public let invoker: AssessmentInvoker
        /// Error or warning message from the assessment execution
        public let message: String?
        /// Resiliency policy of an application.
        public let policy: ResiliencyPolicy?
        /// Current resiliency score for an application.
        public let resiliencyScore: ResiliencyScore?
        ///  A resource error object containing a list of errors retrieving an application's resources.
        public let resourceErrorsDetails: ResourceErrorsDetails?
        /// Starting time for the action.
        public let startTime: Date?
        /// Indicates the AI-generated summary for the Resilience Hub assessment, providing a concise overview that highlights the top risks and recommendations.  This property is available only in the US East (N. Virginia) Region.
        public let summary: AssessmentSummary?
        /// Tags assigned to the resource. A tag is a label that you assign to an Amazon Web Services resource.
        /// Each tag consists of a key/value pair.
        public let tags: [String: String]?
        /// Version name of the published application.
        public let versionName: String?

        @inlinable
        public init(appArn: String? = nil, appVersion: String? = nil, assessmentArn: String, assessmentName: String? = nil, assessmentStatus: AssessmentStatus, compliance: [DisruptionType: DisruptionCompliance]? = nil, complianceStatus: ComplianceStatus? = nil, cost: Cost? = nil, driftStatus: DriftStatus? = nil, endTime: Date? = nil, invoker: AssessmentInvoker, message: String? = nil, policy: ResiliencyPolicy? = nil, resiliencyScore: ResiliencyScore? = nil, resourceErrorsDetails: ResourceErrorsDetails? = nil, startTime: Date? = nil, summary: AssessmentSummary? = nil, tags: [String: String]? = nil, versionName: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.assessmentArn = assessmentArn
            self.assessmentName = assessmentName
            self.assessmentStatus = assessmentStatus
            self.compliance = compliance
            self.complianceStatus = complianceStatus
            self.cost = cost
            self.driftStatus = driftStatus
            self.endTime = endTime
            self.invoker = invoker
            self.message = message
            self.policy = policy
            self.resiliencyScore = resiliencyScore
            self.resourceErrorsDetails = resourceErrorsDetails
            self.startTime = startTime
            self.summary = summary
            self.tags = tags
            self.versionName = versionName
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case assessmentArn = "assessmentArn"
            case assessmentName = "assessmentName"
            case assessmentStatus = "assessmentStatus"
            case compliance = "compliance"
            case complianceStatus = "complianceStatus"
            case cost = "cost"
            case driftStatus = "driftStatus"
            case endTime = "endTime"
            case invoker = "invoker"
            case message = "message"
            case policy = "policy"
            case resiliencyScore = "resiliencyScore"
            case resourceErrorsDetails = "resourceErrorsDetails"
            case startTime = "startTime"
            case summary = "summary"
            case tags = "tags"
            case versionName = "versionName"
        }
    }

    public struct AppAssessmentSummary: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String?
        /// Version of an application.
        public let appVersion: String?
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// Name of the assessment.
        public let assessmentName: String?
        /// Current status of the assessment for the resiliency policy.
        public let assessmentStatus: AssessmentStatus
        /// Current status of compliance for the resiliency policy.
        public let complianceStatus: ComplianceStatus?
        /// Cost for an application.
        public let cost: Cost?
        /// Indicates if compliance drifts (deviations) were detected while running an assessment for your application.
        public let driftStatus: DriftStatus?
        /// End time for the action.
        public let endTime: Date?
        /// Entity that invoked the assessment.
        public let invoker: AssessmentInvoker?
        /// Message from the assessment run.
        public let message: String?
        /// Current resiliency score for the application.
        public let resiliencyScore: Double?
        /// Starting time for the action.
        public let startTime: Date?
        /// Name of an application version.
        public let versionName: String?

        @inlinable
        public init(appArn: String? = nil, appVersion: String? = nil, assessmentArn: String, assessmentName: String? = nil, assessmentStatus: AssessmentStatus, complianceStatus: ComplianceStatus? = nil, cost: Cost? = nil, driftStatus: DriftStatus? = nil, endTime: Date? = nil, invoker: AssessmentInvoker? = nil, message: String? = nil, resiliencyScore: Double? = nil, startTime: Date? = nil, versionName: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.assessmentArn = assessmentArn
            self.assessmentName = assessmentName
            self.assessmentStatus = assessmentStatus
            self.complianceStatus = complianceStatus
            self.cost = cost
            self.driftStatus = driftStatus
            self.endTime = endTime
            self.invoker = invoker
            self.message = message
            self.resiliencyScore = resiliencyScore
            self.startTime = startTime
            self.versionName = versionName
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case assessmentArn = "assessmentArn"
            case assessmentName = "assessmentName"
            case assessmentStatus = "assessmentStatus"
            case complianceStatus = "complianceStatus"
            case cost = "cost"
            case driftStatus = "driftStatus"
            case endTime = "endTime"
            case invoker = "invoker"
            case message = "message"
            case resiliencyScore = "resiliencyScore"
            case startTime = "startTime"
            case versionName = "versionName"
        }
    }

    public struct AppComponent: AWSDecodableShape {
        /// Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account. Key: "failover-regions"  Value: "[{"region":"&lt;REGION&gt;", "accounts":[{"id":"&lt;ACCOUNT_ID&gt;"}]}]"
        public let additionalInfo: [String: [String]]?
        /// Identifier of the Application Component.
        public let id: String?
        /// Name of the Application Component.
        public let name: String
        /// The type of Application Component.
        public let type: String

        @inlinable
        public init(additionalInfo: [String: [String]]? = nil, id: String? = nil, name: String, type: String) {
            self.additionalInfo = additionalInfo
            self.id = id
            self.name = name
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case additionalInfo = "additionalInfo"
            case id = "id"
            case name = "name"
            case type = "type"
        }
    }

    public struct AppComponentCompliance: AWSDecodableShape {
        /// Name of the Application Component.
        public let appComponentName: String?
        /// The compliance of the Application Component against the resiliency policy.
        public let compliance: [DisruptionType: DisruptionCompliance]?
        /// The cost for the application.
        public let cost: Cost?
        /// The compliance message.
        public let message: String?
        /// The current resiliency score for the application.
        public let resiliencyScore: ResiliencyScore?
        /// Status of the action.
        public let status: ComplianceStatus?

        @inlinable
        public init(appComponentName: String? = nil, compliance: [DisruptionType: DisruptionCompliance]? = nil, cost: Cost? = nil, message: String? = nil, resiliencyScore: ResiliencyScore? = nil, status: ComplianceStatus? = nil) {
            self.appComponentName = appComponentName
            self.compliance = compliance
            self.cost = cost
            self.message = message
            self.resiliencyScore = resiliencyScore
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case appComponentName = "appComponentName"
            case compliance = "compliance"
            case cost = "cost"
            case message = "message"
            case resiliencyScore = "resiliencyScore"
            case status = "status"
        }
    }

    public struct AppInputSource: AWSDecodableShape {
        /// The namespace on your Amazon Elastic Kubernetes Service cluster.
        public let eksSourceClusterNamespace: EksSourceClusterNamespace?
        /// The resource type of the input source.
        public let importType: ResourceMappingType
        /// The number of resources.
        public let resourceCount: Int?
        /// The Amazon Resource Name (ARN) of the input source. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let sourceArn: String?
        /// The name of the input source.
        public let sourceName: String?
        /// The name of the Terraform s3 state ﬁle.
        public let terraformSource: TerraformSource?

        @inlinable
        public init(eksSourceClusterNamespace: EksSourceClusterNamespace? = nil, importType: ResourceMappingType, resourceCount: Int? = nil, sourceArn: String? = nil, sourceName: String? = nil, terraformSource: TerraformSource? = nil) {
            self.eksSourceClusterNamespace = eksSourceClusterNamespace
            self.importType = importType
            self.resourceCount = resourceCount
            self.sourceArn = sourceArn
            self.sourceName = sourceName
            self.terraformSource = terraformSource
        }

        private enum CodingKeys: String, CodingKey {
            case eksSourceClusterNamespace = "eksSourceClusterNamespace"
            case importType = "importType"
            case resourceCount = "resourceCount"
            case sourceArn = "sourceArn"
            case sourceName = "sourceName"
            case terraformSource = "terraformSource"
        }
    }

    public struct AppSummary: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        ///  Assessment execution schedule with 'Daily' or 'Disabled' values.
        public let assessmentSchedule: AppAssessmentScheduleType?
        /// Amazon Resource Name (ARN) of  Resource Groups group that is integrated with an AppRegistry application. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let awsApplicationArn: String?
        /// The current status of compliance for the resiliency policy.
        public let complianceStatus: AppComplianceStatusType?
        /// Date and time when the app was created.
        public let creationTime: Date
        /// The optional description for an app.
        public let description: String?
        /// Indicates if compliance drifts (deviations) were detected while running an assessment for your application.
        public let driftStatus: AppDriftStatusType?
        /// Date and time of the most recent compliance evaluation.
        public let lastAppComplianceEvaluationTime: Date?
        /// The name of the application.
        public let name: String
        /// The current resiliency score for the application.
        public let resiliencyScore: Double?
        /// Recovery Point Objective (RPO) in seconds.
        public let rpoInSecs: Int?
        /// Recovery Time Objective (RTO) in seconds.
        public let rtoInSecs: Int?
        /// Status of the application.
        public let status: AppStatusType?

        @inlinable
        public init(appArn: String, assessmentSchedule: AppAssessmentScheduleType? = nil, awsApplicationArn: String? = nil, complianceStatus: AppComplianceStatusType? = nil, creationTime: Date, description: String? = nil, driftStatus: AppDriftStatusType? = nil, lastAppComplianceEvaluationTime: Date? = nil, name: String, resiliencyScore: Double? = nil, rpoInSecs: Int? = nil, rtoInSecs: Int? = nil, status: AppStatusType? = nil) {
            self.appArn = appArn
            self.assessmentSchedule = assessmentSchedule
            self.awsApplicationArn = awsApplicationArn
            self.complianceStatus = complianceStatus
            self.creationTime = creationTime
            self.description = description
            self.driftStatus = driftStatus
            self.lastAppComplianceEvaluationTime = lastAppComplianceEvaluationTime
            self.name = name
            self.resiliencyScore = resiliencyScore
            self.rpoInSecs = rpoInSecs
            self.rtoInSecs = rtoInSecs
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case assessmentSchedule = "assessmentSchedule"
            case awsApplicationArn = "awsApplicationArn"
            case complianceStatus = "complianceStatus"
            case creationTime = "creationTime"
            case description = "description"
            case driftStatus = "driftStatus"
            case lastAppComplianceEvaluationTime = "lastAppComplianceEvaluationTime"
            case name = "name"
            case resiliencyScore = "resiliencyScore"
            case rpoInSecs = "rpoInSecs"
            case rtoInSecs = "rtoInSecs"
            case status = "status"
        }
    }

    public struct AppVersionSummary: AWSDecodableShape {
        /// Version of an application.
        public let appVersion: String
        /// Creation time of the application version.
        public let creationTime: Date?
        /// Identifier of the application version.
        public let identifier: Int64?
        /// Name of the application version.
        public let versionName: String?

        @inlinable
        public init(appVersion: String, creationTime: Date? = nil, identifier: Int64? = nil, versionName: String? = nil) {
            self.appVersion = appVersion
            self.creationTime = creationTime
            self.identifier = identifier
            self.versionName = versionName
        }

        private enum CodingKeys: String, CodingKey {
            case appVersion = "appVersion"
            case creationTime = "creationTime"
            case identifier = "identifier"
            case versionName = "versionName"
        }
    }

    public struct AssessmentRiskRecommendation: AWSDecodableShape {
        /// Indicates the Application Components (AppComponents) that were assessed as part of the assessment and are associated with the identified risk and recommendation.  This property is available only in the US East (N. Virginia) Region.
        public let appComponents: [String]?
        /// Indicates the recommendation provided by the Resilience Hub to address the identified risks in the application.  This property is available only in the US East (N. Virginia) Region.
        public let recommendation: String?
        /// Indicates the description of the potential risk identified in the application as part of the Resilience Hub assessment.  This property is available only in the US East (N. Virginia) Region.
        public let risk: String?

        @inlinable
        public init(appComponents: [String]? = nil, recommendation: String? = nil, risk: String? = nil) {
            self.appComponents = appComponents
            self.recommendation = recommendation
            self.risk = risk
        }

        private enum CodingKeys: String, CodingKey {
            case appComponents = "appComponents"
            case recommendation = "recommendation"
            case risk = "risk"
        }
    }

    public struct AssessmentSummary: AWSDecodableShape {
        /// Indicates the top risks and recommendations identified by the Resilience Hub assessment,  each representing a specific risk and the corresponding recommendation to address it.  This property is available only in the US East (N. Virginia) Region.
        public let riskRecommendations: [AssessmentRiskRecommendation]?
        /// Indicates a concise summary that provides an overview of the Resilience Hub assessment.  This property is available only in the US East (N. Virginia) Region.
        public let summary: String?

        @inlinable
        public init(riskRecommendations: [AssessmentRiskRecommendation]? = nil, summary: String? = nil) {
            self.riskRecommendations = riskRecommendations
            self.summary = summary
        }

        private enum CodingKeys: String, CodingKey {
            case riskRecommendations = "riskRecommendations"
            case summary = "summary"
        }
    }

    public struct BatchUpdateRecommendationStatusFailedEntry: AWSDecodableShape {
        /// An identifier of an entry in this batch that is used to communicate the result.  The entryIds of a batch request need to be unique within a request.
        public let entryId: String
        /// Indicates the error that occurred while excluding an operational recommendation.
        public let errorMessage: String

        @inlinable
        public init(entryId: String, errorMessage: String) {
            self.entryId = entryId
            self.errorMessage = errorMessage
        }

        private enum CodingKeys: String, CodingKey {
            case entryId = "entryId"
            case errorMessage = "errorMessage"
        }
    }

    public struct BatchUpdateRecommendationStatusRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Defines the list of operational recommendations that need to be included or excluded.
        public let requestEntries: [UpdateRecommendationStatusRequestEntry]

        @inlinable
        public init(appArn: String, requestEntries: [UpdateRecommendationStatusRequestEntry]) {
            self.appArn = appArn
            self.requestEntries = requestEntries
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.requestEntries.forEach {
                try $0.validate(name: "\(name).requestEntries[]")
            }
            try self.validate(self.requestEntries, name: "requestEntries", parent: name, max: 50)
            try self.validate(self.requestEntries, name: "requestEntries", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case requestEntries = "requestEntries"
        }
    }

    public struct BatchUpdateRecommendationStatusResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// A list of items with error details about each item, which could not be included or excluded.
        public let failedEntries: [BatchUpdateRecommendationStatusFailedEntry]
        /// A list of items that were included or excluded.
        public let successfulEntries: [BatchUpdateRecommendationStatusSuccessfulEntry]

        @inlinable
        public init(appArn: String, failedEntries: [BatchUpdateRecommendationStatusFailedEntry], successfulEntries: [BatchUpdateRecommendationStatusSuccessfulEntry]) {
            self.appArn = appArn
            self.failedEntries = failedEntries
            self.successfulEntries = successfulEntries
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case failedEntries = "failedEntries"
            case successfulEntries = "successfulEntries"
        }
    }

    public struct BatchUpdateRecommendationStatusSuccessfulEntry: AWSDecodableShape {
        /// Indicates the identifier of an AppComponent.
        public let appComponentId: String?
        /// An identifier for an entry in this batch that is used to communicate the result.  The entryIds of a batch request need to be unique within a request.
        public let entryId: String
        /// Indicates if the operational recommendation was successfully excluded.
        public let excluded: Bool
        /// Indicates the reason for excluding an operational recommendation.
        public let excludeReason: ExcludeRecommendationReason?
        /// The operational recommendation item.
        public let item: UpdateRecommendationStatusItem?
        /// Reference identifier of the operational recommendation.
        public let referenceId: String

        @inlinable
        public init(appComponentId: String? = nil, entryId: String, excluded: Bool, excludeReason: ExcludeRecommendationReason? = nil, item: UpdateRecommendationStatusItem? = nil, referenceId: String) {
            self.appComponentId = appComponentId
            self.entryId = entryId
            self.excluded = excluded
            self.excludeReason = excludeReason
            self.item = item
            self.referenceId = referenceId
        }

        private enum CodingKeys: String, CodingKey {
            case appComponentId = "appComponentId"
            case entryId = "entryId"
            case excluded = "excluded"
            case excludeReason = "excludeReason"
            case item = "item"
            case referenceId = "referenceId"
        }
    }

    public struct ComplianceDrift: AWSDecodableShape {
        /// Assessment identifier that is associated with this drift item.
        public let actualReferenceId: String?
        /// Actual compliance value of the entity.
        public let actualValue: [DisruptionType: DisruptionCompliance]?
        /// Identifier of your application.
        public let appId: String?
        /// Published version of your application on which drift was detected.
        public let appVersion: String?
        /// Difference type between actual and expected recovery point objective (RPO) and recovery time objective (RTO) values. Currently, Resilience Hub supports only NotEqual difference type.
        public let diffType: DifferenceType?
        /// The type of drift detected. Currently, Resilience Hub supports only ApplicationCompliance drift type.
        public let driftType: DriftType?
        /// Identifier of an entity in which drift was detected. For compliance drift, the entity ID can be either application ID or the AppComponent ID.
        public let entityId: String?
        /// The type of entity in which drift was detected. For compliance drifts, Resilience Hub supports AWS::ResilienceHub::AppComponent and AWS::ResilienceHub::Application.
        public let entityType: String?
        /// Assessment identifier of a previous assessment of the same application version. Resilience Hub uses the previous assessment (associated with the reference identifier) to compare the compliance with the current assessment to identify drifts.
        public let expectedReferenceId: String?
        /// The expected compliance value of an entity.
        public let expectedValue: [DisruptionType: DisruptionCompliance]?

        @inlinable
        public init(actualReferenceId: String? = nil, actualValue: [DisruptionType: DisruptionCompliance]? = nil, appId: String? = nil, appVersion: String? = nil, diffType: DifferenceType? = nil, driftType: DriftType? = nil, entityId: String? = nil, entityType: String? = nil, expectedReferenceId: String? = nil, expectedValue: [DisruptionType: DisruptionCompliance]? = nil) {
            self.actualReferenceId = actualReferenceId
            self.actualValue = actualValue
            self.appId = appId
            self.appVersion = appVersion
            self.diffType = diffType
            self.driftType = driftType
            self.entityId = entityId
            self.entityType = entityType
            self.expectedReferenceId = expectedReferenceId
            self.expectedValue = expectedValue
        }

        private enum CodingKeys: String, CodingKey {
            case actualReferenceId = "actualReferenceId"
            case actualValue = "actualValue"
            case appId = "appId"
            case appVersion = "appVersion"
            case diffType = "diffType"
            case driftType = "driftType"
            case entityId = "entityId"
            case entityType = "entityType"
            case expectedReferenceId = "expectedReferenceId"
            case expectedValue = "expectedValue"
        }
    }

    public struct ComponentRecommendation: AWSDecodableShape {
        /// Name of the Application Component.
        public let appComponentName: String
        /// List of recommendations.
        public let configRecommendations: [ConfigRecommendation]
        /// Status of the recommendation.
        public let recommendationStatus: RecommendationComplianceStatus

        @inlinable
        public init(appComponentName: String, configRecommendations: [ConfigRecommendation], recommendationStatus: RecommendationComplianceStatus) {
            self.appComponentName = appComponentName
            self.configRecommendations = configRecommendations
            self.recommendationStatus = recommendationStatus
        }

        private enum CodingKeys: String, CodingKey {
            case appComponentName = "appComponentName"
            case configRecommendations = "configRecommendations"
            case recommendationStatus = "recommendationStatus"
        }
    }

    public struct Condition: AWSEncodableShape {
        /// Indicates the field in the metric.
        public let field: String
        /// Indicates the type of operator or comparison to be used when evaluating a condition against the specified field.
        public let `operator`: ConditionOperatorType
        /// Indicates the value or data against which a condition is evaluated.
        public let value: String?

        @inlinable
        public init(field: String, operator: ConditionOperatorType, value: String? = nil) {
            self.field = field
            self.`operator` = `operator`
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.field, name: "field", parent: name, max: 255)
            try self.validate(self.field, name: "field", parent: name, min: 1)
            try self.validate(self.value, name: "value", parent: name, max: 255)
            try self.validate(self.value, name: "value", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case field = "field"
            case `operator` = "operator"
            case value = "value"
        }
    }

    public struct ConfigRecommendation: AWSDecodableShape {
        /// Name of the Application Component.
        public let appComponentName: String?
        /// The current compliance against the resiliency policy before applying the configuration change.
        public let compliance: [DisruptionType: DisruptionCompliance]?
        /// The cost for the application.
        public let cost: Cost?
        /// The optional description for an app.
        public let description: String?
        /// The architecture type.
        public let haArchitecture: HaArchitecture?
        /// The name of the recommendation configuration.
        public let name: String
        /// The type of optimization.
        public let optimizationType: ConfigRecommendationOptimizationType
        /// The expected compliance against the resiliency policy after applying the configuration change.
        public let recommendationCompliance: [DisruptionType: RecommendationDisruptionCompliance]?
        /// Reference identifier for the recommendation configuration.
        public let referenceId: String
        /// List of the suggested configuration changes.
        public let suggestedChanges: [String]?

        @inlinable
        public init(appComponentName: String? = nil, compliance: [DisruptionType: DisruptionCompliance]? = nil, cost: Cost? = nil, description: String? = nil, haArchitecture: HaArchitecture? = nil, name: String, optimizationType: ConfigRecommendationOptimizationType, recommendationCompliance: [DisruptionType: RecommendationDisruptionCompliance]? = nil, referenceId: String, suggestedChanges: [String]? = nil) {
            self.appComponentName = appComponentName
            self.compliance = compliance
            self.cost = cost
            self.description = description
            self.haArchitecture = haArchitecture
            self.name = name
            self.optimizationType = optimizationType
            self.recommendationCompliance = recommendationCompliance
            self.referenceId = referenceId
            self.suggestedChanges = suggestedChanges
        }

        private enum CodingKeys: String, CodingKey {
            case appComponentName = "appComponentName"
            case compliance = "compliance"
            case cost = "cost"
            case description = "description"
            case haArchitecture = "haArchitecture"
            case name = "name"
            case optimizationType = "optimizationType"
            case recommendationCompliance = "recommendationCompliance"
            case referenceId = "referenceId"
            case suggestedChanges = "suggestedChanges"
        }
    }

    public struct ConflictException: AWSErrorShape {
        public let message: String?
        /// The identifier of the resource that the exception applies to.
        public let resourceId: String?
        /// The type of the resource that the exception applies to.
        public let resourceType: String?

        @inlinable
        public init(message: String? = nil, resourceId: String? = nil, resourceType: String? = nil) {
            self.message = message
            self.resourceId = resourceId
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case message = "message"
            case resourceId = "resourceId"
            case resourceType = "resourceType"
        }
    }

    public struct Cost: AWSDecodableShape {
        /// The cost amount.
        public let amount: Double
        /// The cost currency, for example USD.
        public let currency: String
        /// The cost frequency.
        public let frequency: CostFrequency

        @inlinable
        public init(amount: Double, currency: String, frequency: CostFrequency) {
            self.amount = amount
            self.currency = currency
            self.frequency = frequency
        }

        private enum CodingKeys: String, CodingKey {
            case amount = "amount"
            case currency = "currency"
            case frequency = "frequency"
        }
    }

    public struct CreateAppRequest: AWSEncodableShape {
        ///  Assessment execution schedule with 'Daily' or 'Disabled' values.
        public let assessmentSchedule: AppAssessmentScheduleType?
        /// Amazon Resource Name (ARN) of  Resource Groups group that is integrated with an AppRegistry application. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let awsApplicationArn: String?
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// The optional description for an app.
        public let description: String?
        /// The list of events you would like to subscribe and get notification for. Currently, Resilience Hub supports only Drift detected and Scheduled assessment failure events notification.
        public let eventSubscriptions: [EventSubscription]?
        /// Name of the application.
        public let name: String
        /// Defines the roles and credentials that Resilience Hub would use while creating the application, importing its resources, and running an assessment.
        public let permissionModel: PermissionModel?
        /// Amazon Resource Name (ARN) of the resiliency policy. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:resiliency-policy/policy-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let policyArn: String?
        /// Tags assigned to the resource. A tag is a label that you assign to an Amazon Web Services resource.
        /// Each tag consists of a key/value pair.
        public let tags: [String: String]?

        @inlinable
        public init(assessmentSchedule: AppAssessmentScheduleType? = nil, awsApplicationArn: String? = nil, clientToken: String? = CreateAppRequest.idempotencyToken(), description: String? = nil, eventSubscriptions: [EventSubscription]? = nil, name: String, permissionModel: PermissionModel? = nil, policyArn: String? = nil, tags: [String: String]? = nil) {
            self.assessmentSchedule = assessmentSchedule
            self.awsApplicationArn = awsApplicationArn
            self.clientToken = clientToken
            self.description = description
            self.eventSubscriptions = eventSubscriptions
            self.name = name
            self.permissionModel = permissionModel
            self.policyArn = policyArn
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.awsApplicationArn, name: "awsApplicationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.validate(self.description, name: "description", parent: name, max: 500)
            try self.eventSubscriptions?.forEach {
                try $0.validate(name: "\(name).eventSubscriptions[]")
            }
            try self.validate(self.eventSubscriptions, name: "eventSubscriptions", parent: name, max: 10)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.permissionModel?.validate(name: "\(name).permissionModel")
            try self.validate(self.policyArn, name: "policyArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^[^\\x00-\\x1f\\x22]+$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^[^\\x00-\\x1f\\x22]*$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentSchedule = "assessmentSchedule"
            case awsApplicationArn = "awsApplicationArn"
            case clientToken = "clientToken"
            case description = "description"
            case eventSubscriptions = "eventSubscriptions"
            case name = "name"
            case permissionModel = "permissionModel"
            case policyArn = "policyArn"
            case tags = "tags"
        }
    }

    public struct CreateAppResponse: AWSDecodableShape {
        /// The created application returned as an object with details including compliance status, creation time, description, resiliency score, and more.
        public let app: App

        @inlinable
        public init(app: App) {
            self.app = app
        }

        private enum CodingKeys: String, CodingKey {
            case app = "app"
        }
    }

    public struct CreateAppVersionAppComponentRequest: AWSEncodableShape {
        /// Currently, there is no supported additional information for Application Components.
        public let additionalInfo: [String: [String]]?
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// Identifier of the Application Component.
        public let id: String?
        /// Name of the Application Component.
        public let name: String
        /// Type of Application Component. For more information about the types of Application Component, see Grouping resources in an AppComponent.
        public let type: String

        @inlinable
        public init(additionalInfo: [String: [String]]? = nil, appArn: String, clientToken: String? = CreateAppVersionAppComponentRequest.idempotencyToken(), id: String? = nil, name: String, type: String) {
            self.additionalInfo = additionalInfo
            self.appArn = appArn
            self.clientToken = clientToken
            self.id = id
            self.name = name
            self.type = type
        }

        public func validate(name: String) throws {
            try self.additionalInfo?.forEach {
                try validate($0.key, name: "additionalInfo.key", parent: name, pattern: "^\\S{1,128}$")
                try validate($0.value, name: "additionalInfo[\"\($0.key)\"]", parent: name, max: 10)
                try validate($0.value, name: "additionalInfo[\"\($0.key)\"]", parent: name, min: 1)
            }
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.validate(self.id, name: "id", parent: name, max: 255)
            try self.validate(self.id, name: "id", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 255)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.type, name: "type", parent: name, max: 255)
            try self.validate(self.type, name: "type", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case additionalInfo = "additionalInfo"
            case appArn = "appArn"
            case clientToken = "clientToken"
            case id = "id"
            case name = "name"
            case type = "type"
        }
    }

    public struct CreateAppVersionAppComponentResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// List of Application Components that belong to this resource.
        public let appComponent: AppComponent?
        /// Resilience Hub application version.
        public let appVersion: String

        @inlinable
        public init(appArn: String, appComponent: AppComponent? = nil, appVersion: String) {
            self.appArn = appArn
            self.appComponent = appComponent
            self.appVersion = appVersion
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appComponent = "appComponent"
            case appVersion = "appVersion"
        }
    }

    public struct CreateAppVersionResourceRequest: AWSEncodableShape {
        /// Currently, there is no supported additional information for resources.
        public let additionalInfo: [String: [String]]?
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// List of Application Components that this resource belongs to. If an Application Component is not part of the Resilience Hub application, it will be added.
        public let appComponents: [String]
        /// Amazon Web Services account that owns the physical resource.
        public let awsAccountId: String?
        /// Amazon Web Services region that owns the physical resource.
        public let awsRegion: String?
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// Logical identifier of the resource.
        public let logicalResourceId: LogicalResourceId
        /// Physical identifier of the resource.
        public let physicalResourceId: String
        /// Name of the resource.
        public let resourceName: String?
        /// Type of resource.
        public let resourceType: String

        @inlinable
        public init(additionalInfo: [String: [String]]? = nil, appArn: String, appComponents: [String], awsAccountId: String? = nil, awsRegion: String? = nil, clientToken: String? = CreateAppVersionResourceRequest.idempotencyToken(), logicalResourceId: LogicalResourceId, physicalResourceId: String, resourceName: String? = nil, resourceType: String) {
            self.additionalInfo = additionalInfo
            self.appArn = appArn
            self.appComponents = appComponents
            self.awsAccountId = awsAccountId
            self.awsRegion = awsRegion
            self.clientToken = clientToken
            self.logicalResourceId = logicalResourceId
            self.physicalResourceId = physicalResourceId
            self.resourceName = resourceName
            self.resourceType = resourceType
        }

        public func validate(name: String) throws {
            try self.additionalInfo?.forEach {
                try validate($0.key, name: "additionalInfo.key", parent: name, pattern: "^\\S{1,128}$")
                try validate($0.value, name: "additionalInfo[\"\($0.key)\"]", parent: name, max: 10)
                try validate($0.value, name: "additionalInfo[\"\($0.key)\"]", parent: name, min: 1)
            }
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.appComponents.forEach {
                try validate($0, name: "appComponents[]", parent: name, max: 255)
                try validate($0, name: "appComponents[]", parent: name, min: 1)
            }
            try self.validate(self.awsAccountId, name: "awsAccountId", parent: name, pattern: "^[0-9]{12}$")
            try self.validate(self.awsRegion, name: "awsRegion", parent: name, pattern: "^[a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.logicalResourceId.validate(name: "\(name).logicalResourceId")
            try self.validate(self.physicalResourceId, name: "physicalResourceId", parent: name, max: 2048)
            try self.validate(self.physicalResourceId, name: "physicalResourceId", parent: name, min: 1)
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.resourceType, name: "resourceType", parent: name, max: 255)
            try self.validate(self.resourceType, name: "resourceType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case additionalInfo = "additionalInfo"
            case appArn = "appArn"
            case appComponents = "appComponents"
            case awsAccountId = "awsAccountId"
            case awsRegion = "awsRegion"
            case clientToken = "clientToken"
            case logicalResourceId = "logicalResourceId"
            case physicalResourceId = "physicalResourceId"
            case resourceName = "resourceName"
            case resourceType = "resourceType"
        }
    }

    public struct CreateAppVersionResourceResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Resilience Hub application version.
        public let appVersion: String
        /// Defines a physical resource. A physical resource is a resource that exists in your account. It can be identified using an Amazon Resource Name (ARN) or a Resilience Hub-native identifier.
        public let physicalResource: PhysicalResource?

        @inlinable
        public init(appArn: String, appVersion: String, physicalResource: PhysicalResource? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.physicalResource = physicalResource
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case physicalResource = "physicalResource"
        }
    }

    public struct CreateRecommendationTemplateRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// The name of the Amazon S3 bucket that will contain the recommendation template.
        public let bucketName: String?
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// The format for the recommendation template.  CfnJson  The template is CloudFormation JSON.  CfnYaml  The template is CloudFormation YAML.
        public let format: TemplateFormat?
        /// The name for the recommendation template.
        public let name: String
        /// Identifiers for the recommendations used to create a recommendation template.
        public let recommendationIds: [String]?
        /// An array of strings that specify the recommendation template type or types.  Alarm  The template is an AlarmRecommendation template.  Sop  The template is a SopRecommendation template.  Test  The template is a TestRecommendation template.
        public let recommendationTypes: [RenderRecommendationType]?
        /// Tags assigned to the resource. A tag is a label that you assign to an Amazon Web Services resource.
        /// Each tag consists of a key/value pair.
        public let tags: [String: String]?

        @inlinable
        public init(assessmentArn: String, bucketName: String? = nil, clientToken: String? = CreateRecommendationTemplateRequest.idempotencyToken(), format: TemplateFormat? = nil, name: String, recommendationIds: [String]? = nil, recommendationTypes: [RenderRecommendationType]? = nil, tags: [String: String]? = nil) {
            self.assessmentArn = assessmentArn
            self.bucketName = bucketName
            self.clientToken = clientToken
            self.format = format
            self.name = name
            self.recommendationIds = recommendationIds
            self.recommendationTypes = recommendationTypes
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.validate(self.name, name: "name", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.recommendationIds?.forEach {
                try validate($0, name: "recommendationIds[]", parent: name, pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$")
            }
            try self.validate(self.recommendationIds, name: "recommendationIds", parent: name, max: 200)
            try self.validate(self.recommendationIds, name: "recommendationIds", parent: name, min: 1)
            try self.validate(self.recommendationTypes, name: "recommendationTypes", parent: name, max: 4)
            try self.validate(self.recommendationTypes, name: "recommendationTypes", parent: name, min: 1)
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^[^\\x00-\\x1f\\x22]+$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^[^\\x00-\\x1f\\x22]*$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
            case bucketName = "bucketName"
            case clientToken = "clientToken"
            case format = "format"
            case name = "name"
            case recommendationIds = "recommendationIds"
            case recommendationTypes = "recommendationTypes"
            case tags = "tags"
        }
    }

    public struct CreateRecommendationTemplateResponse: AWSDecodableShape {
        /// The newly created recommendation template, returned as an object. This object includes the template's name, format, status, tags, Amazon S3 bucket location, and more.
        public let recommendationTemplate: RecommendationTemplate?

        @inlinable
        public init(recommendationTemplate: RecommendationTemplate? = nil) {
            self.recommendationTemplate = recommendationTemplate
        }

        private enum CodingKeys: String, CodingKey {
            case recommendationTemplate = "recommendationTemplate"
        }
    }

    public struct CreateResiliencyPolicyRequest: AWSEncodableShape {
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// Specifies a high-level geographical location constraint for where your resilience policy data can be stored.
        public let dataLocationConstraint: DataLocationConstraint?
        /// The type of resiliency policy to be created, including the recovery time objective (RTO) and recovery point objective (RPO) in seconds.
        public let policy: [DisruptionType: FailurePolicy]
        /// Description of the resiliency policy.
        public let policyDescription: String?
        /// Name of the resiliency policy.
        public let policyName: String
        /// Tags assigned to the resource. A tag is a label that you assign to an Amazon Web Services resource.
        /// Each tag consists of a key/value pair.
        public let tags: [String: String]?
        /// The tier for this resiliency policy, ranging from the highest severity (MissionCritical) to lowest (NonCritical).
        public let tier: ResiliencyPolicyTier

        @inlinable
        public init(clientToken: String? = CreateResiliencyPolicyRequest.idempotencyToken(), dataLocationConstraint: DataLocationConstraint? = nil, policy: [DisruptionType: FailurePolicy], policyDescription: String? = nil, policyName: String, tags: [String: String]? = nil, tier: ResiliencyPolicyTier) {
            self.clientToken = clientToken
            self.dataLocationConstraint = dataLocationConstraint
            self.policy = policy
            self.policyDescription = policyDescription
            self.policyName = policyName
            self.tags = tags
            self.tier = tier
        }

        public func validate(name: String) throws {
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.policy.forEach {
                try $0.value.validate(name: "\(name).policy[\"\($0.key)\"]")
            }
            try self.validate(self.policyDescription, name: "policyDescription", parent: name, max: 500)
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^[^\\x00-\\x1f\\x22]+$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^[^\\x00-\\x1f\\x22]*$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case clientToken = "clientToken"
            case dataLocationConstraint = "dataLocationConstraint"
            case policy = "policy"
            case policyDescription = "policyDescription"
            case policyName = "policyName"
            case tags = "tags"
            case tier = "tier"
        }
    }

    public struct CreateResiliencyPolicyResponse: AWSDecodableShape {
        /// The type of resiliency policy that was created, including the recovery time objective (RTO) and recovery point objective (RPO) in seconds.
        public let policy: ResiliencyPolicy

        @inlinable
        public init(policy: ResiliencyPolicy) {
            self.policy = policy
        }

        private enum CodingKeys: String, CodingKey {
            case policy = "policy"
        }
    }

    public struct DeleteAppAssessmentRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?

        @inlinable
        public init(assessmentArn: String, clientToken: String? = DeleteAppAssessmentRequest.idempotencyToken()) {
            self.assessmentArn = assessmentArn
            self.clientToken = clientToken
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
            case clientToken = "clientToken"
        }
    }

    public struct DeleteAppAssessmentResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// The current status of the assessment for the resiliency policy.
        public let assessmentStatus: AssessmentStatus

        @inlinable
        public init(assessmentArn: String, assessmentStatus: AssessmentStatus) {
            self.assessmentArn = assessmentArn
            self.assessmentStatus = assessmentStatus
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
            case assessmentStatus = "assessmentStatus"
        }
    }

    public struct DeleteAppInputSourceRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// The namespace on your Amazon Elastic Kubernetes Service cluster that you want to delete from the Resilience Hub application.
        public let eksSourceClusterNamespace: EksSourceClusterNamespace?
        /// The Amazon Resource Name (ARN) of the imported resource you want to remove from the Resilience Hub application. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let sourceArn: String?
        /// The imported Terraform s3 state ﬁle you want to remove from the Resilience Hub application.
        public let terraformSource: TerraformSource?

        @inlinable
        public init(appArn: String, clientToken: String? = DeleteAppInputSourceRequest.idempotencyToken(), eksSourceClusterNamespace: EksSourceClusterNamespace? = nil, sourceArn: String? = nil, terraformSource: TerraformSource? = nil) {
            self.appArn = appArn
            self.clientToken = clientToken
            self.eksSourceClusterNamespace = eksSourceClusterNamespace
            self.sourceArn = sourceArn
            self.terraformSource = terraformSource
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.eksSourceClusterNamespace?.validate(name: "\(name).eksSourceClusterNamespace")
            try self.validate(self.sourceArn, name: "sourceArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.terraformSource?.validate(name: "\(name).terraformSource")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case clientToken = "clientToken"
            case eksSourceClusterNamespace = "eksSourceClusterNamespace"
            case sourceArn = "sourceArn"
            case terraformSource = "terraformSource"
        }
    }

    public struct DeleteAppInputSourceResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String?
        /// Name of the input source from where the application resource is imported from.
        public let appInputSource: AppInputSource?

        @inlinable
        public init(appArn: String? = nil, appInputSource: AppInputSource? = nil) {
            self.appArn = appArn
            self.appInputSource = appInputSource
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appInputSource = "appInputSource"
        }
    }

    public struct DeleteAppRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// A boolean option to force the deletion of an Resilience Hub application.
        public let forceDelete: Bool?

        @inlinable
        public init(appArn: String, clientToken: String? = DeleteAppRequest.idempotencyToken(), forceDelete: Bool? = nil) {
            self.appArn = appArn
            self.clientToken = clientToken
            self.forceDelete = forceDelete
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case clientToken = "clientToken"
            case forceDelete = "forceDelete"
        }
    }

    public struct DeleteAppResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String

        @inlinable
        public init(appArn: String) {
            self.appArn = appArn
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
        }
    }

    public struct DeleteAppVersionAppComponentRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// Identifier of the Application Component.
        public let id: String

        @inlinable
        public init(appArn: String, clientToken: String? = DeleteAppVersionAppComponentRequest.idempotencyToken(), id: String) {
            self.appArn = appArn
            self.clientToken = clientToken
            self.id = id
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.validate(self.id, name: "id", parent: name, max: 255)
            try self.validate(self.id, name: "id", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case clientToken = "clientToken"
            case id = "id"
        }
    }

    public struct DeleteAppVersionAppComponentResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// List of Application Components that belong to this resource.
        public let appComponent: AppComponent?
        /// Resilience Hub application version.
        public let appVersion: String

        @inlinable
        public init(appArn: String, appComponent: AppComponent? = nil, appVersion: String) {
            self.appArn = appArn
            self.appComponent = appComponent
            self.appVersion = appVersion
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appComponent = "appComponent"
            case appVersion = "appVersion"
        }
    }

    public struct DeleteAppVersionResourceRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Amazon Web Services account that owns the physical resource.
        public let awsAccountId: String?
        /// Amazon Web Services region that owns the physical resource.
        public let awsRegion: String?
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// Logical identifier of the resource.
        public let logicalResourceId: LogicalResourceId?
        /// Physical identifier of the resource.
        public let physicalResourceId: String?
        /// Name of the resource.
        public let resourceName: String?

        @inlinable
        public init(appArn: String, awsAccountId: String? = nil, awsRegion: String? = nil, clientToken: String? = DeleteAppVersionResourceRequest.idempotencyToken(), logicalResourceId: LogicalResourceId? = nil, physicalResourceId: String? = nil, resourceName: String? = nil) {
            self.appArn = appArn
            self.awsAccountId = awsAccountId
            self.awsRegion = awsRegion
            self.clientToken = clientToken
            self.logicalResourceId = logicalResourceId
            self.physicalResourceId = physicalResourceId
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.awsAccountId, name: "awsAccountId", parent: name, pattern: "^[0-9]{12}$")
            try self.validate(self.awsRegion, name: "awsRegion", parent: name, pattern: "^[a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.logicalResourceId?.validate(name: "\(name).logicalResourceId")
            try self.validate(self.physicalResourceId, name: "physicalResourceId", parent: name, max: 2048)
            try self.validate(self.physicalResourceId, name: "physicalResourceId", parent: name, min: 1)
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case awsAccountId = "awsAccountId"
            case awsRegion = "awsRegion"
            case clientToken = "clientToken"
            case logicalResourceId = "logicalResourceId"
            case physicalResourceId = "physicalResourceId"
            case resourceName = "resourceName"
        }
    }

    public struct DeleteAppVersionResourceResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Resilience Hub application version.
        public let appVersion: String
        /// Defines a physical resource. A physical resource is a resource that exists in your account. It can be identified using an Amazon Resource Name (ARN) or a Resilience Hub-native identifier.
        public let physicalResource: PhysicalResource?

        @inlinable
        public init(appArn: String, appVersion: String, physicalResource: PhysicalResource? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.physicalResource = physicalResource
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case physicalResource = "physicalResource"
        }
    }

    public struct DeleteRecommendationTemplateRequest: AWSEncodableShape {
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// The Amazon Resource Name (ARN) for a recommendation template.
        public let recommendationTemplateArn: String

        @inlinable
        public init(clientToken: String? = DeleteRecommendationTemplateRequest.idempotencyToken(), recommendationTemplateArn: String) {
            self.clientToken = clientToken
            self.recommendationTemplateArn = recommendationTemplateArn
        }

        public func validate(name: String) throws {
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.validate(self.recommendationTemplateArn, name: "recommendationTemplateArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: String, CodingKey {
            case clientToken = "clientToken"
            case recommendationTemplateArn = "recommendationTemplateArn"
        }
    }

    public struct DeleteRecommendationTemplateResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) for a recommendation template.
        public let recommendationTemplateArn: String
        /// Status of the action.
        public let status: RecommendationTemplateStatus

        @inlinable
        public init(recommendationTemplateArn: String, status: RecommendationTemplateStatus) {
            self.recommendationTemplateArn = recommendationTemplateArn
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case recommendationTemplateArn = "recommendationTemplateArn"
            case status = "status"
        }
    }

    public struct DeleteResiliencyPolicyRequest: AWSEncodableShape {
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// Amazon Resource Name (ARN) of the resiliency policy. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:resiliency-policy/policy-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let policyArn: String

        @inlinable
        public init(clientToken: String? = DeleteResiliencyPolicyRequest.idempotencyToken(), policyArn: String) {
            self.clientToken = clientToken
            self.policyArn = policyArn
        }

        public func validate(name: String) throws {
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.validate(self.policyArn, name: "policyArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: String, CodingKey {
            case clientToken = "clientToken"
            case policyArn = "policyArn"
        }
    }

    public struct DeleteResiliencyPolicyResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the resiliency policy. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:resiliency-policy/policy-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let policyArn: String

        @inlinable
        public init(policyArn: String) {
            self.policyArn = policyArn
        }

        private enum CodingKeys: String, CodingKey {
            case policyArn = "policyArn"
        }
    }

    public struct DescribeAppAssessmentRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String

        @inlinable
        public init(assessmentArn: String) {
            self.assessmentArn = assessmentArn
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
        }
    }

    public struct DescribeAppAssessmentResponse: AWSDecodableShape {
        /// The assessment for an Resilience Hub application, returned as an object. This object includes Amazon Resource Names (ARNs), compliance information, compliance status, cost, messages, resiliency scores, and more.
        public let assessment: AppAssessment

        @inlinable
        public init(assessment: AppAssessment) {
            self.assessment = assessment
        }

        private enum CodingKeys: String, CodingKey {
            case assessment = "assessment"
        }
    }

    public struct DescribeAppRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String

        @inlinable
        public init(appArn: String) {
            self.appArn = appArn
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
        }
    }

    public struct DescribeAppResponse: AWSDecodableShape {
        /// The specified application, returned as an object with details including compliance status, creation time, description, resiliency score, and more.
        public let app: App

        @inlinable
        public init(app: App) {
            self.app = app
        }

        private enum CodingKeys: String, CodingKey {
            case app = "app"
        }
    }

    public struct DescribeAppVersionAppComponentRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Resilience Hub application version.
        public let appVersion: String
        /// Identifier of the Application Component.
        public let id: String

        @inlinable
        public init(appArn: String, appVersion: String, id: String) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.id = id
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
            try self.validate(self.id, name: "id", parent: name, max: 255)
            try self.validate(self.id, name: "id", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case id = "id"
        }
    }

    public struct DescribeAppVersionAppComponentResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// List of Application Components that belong to this resource.
        public let appComponent: AppComponent?
        /// Resilience Hub application version.
        public let appVersion: String

        @inlinable
        public init(appArn: String, appComponent: AppComponent? = nil, appVersion: String) {
            self.appArn = appArn
            self.appComponent = appComponent
            self.appVersion = appVersion
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appComponent = "appComponent"
            case appVersion = "appVersion"
        }
    }

    public struct DescribeAppVersionRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Resilience Hub application version.
        public let appVersion: String

        @inlinable
        public init(appArn: String, appVersion: String) {
            self.appArn = appArn
            self.appVersion = appVersion
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
        }
    }

    public struct DescribeAppVersionResourceRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Resilience Hub application version.
        public let appVersion: String
        /// Amazon Web Services account that owns the physical resource.
        public let awsAccountId: String?
        /// Amazon Web Services region that owns the physical resource.
        public let awsRegion: String?
        /// Logical identifier of the resource.
        public let logicalResourceId: LogicalResourceId?
        /// Physical identifier of the resource.
        public let physicalResourceId: String?
        /// Name of the resource.
        public let resourceName: String?

        @inlinable
        public init(appArn: String, appVersion: String, awsAccountId: String? = nil, awsRegion: String? = nil, logicalResourceId: LogicalResourceId? = nil, physicalResourceId: String? = nil, resourceName: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.awsAccountId = awsAccountId
            self.awsRegion = awsRegion
            self.logicalResourceId = logicalResourceId
            self.physicalResourceId = physicalResourceId
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
            try self.validate(self.awsAccountId, name: "awsAccountId", parent: name, pattern: "^[0-9]{12}$")
            try self.validate(self.awsRegion, name: "awsRegion", parent: name, pattern: "^[a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]$")
            try self.logicalResourceId?.validate(name: "\(name).logicalResourceId")
            try self.validate(self.physicalResourceId, name: "physicalResourceId", parent: name, max: 2048)
            try self.validate(self.physicalResourceId, name: "physicalResourceId", parent: name, min: 1)
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case awsAccountId = "awsAccountId"
            case awsRegion = "awsRegion"
            case logicalResourceId = "logicalResourceId"
            case physicalResourceId = "physicalResourceId"
            case resourceName = "resourceName"
        }
    }

    public struct DescribeAppVersionResourceResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Resilience Hub application version.
        public let appVersion: String
        /// Defines a physical resource. A physical resource is a resource that exists in your account. It can be identified using an Amazon Resource Name (ARN) or a Resilience Hub-native identifier.
        public let physicalResource: PhysicalResource?

        @inlinable
        public init(appArn: String, appVersion: String, physicalResource: PhysicalResource? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.physicalResource = physicalResource
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case physicalResource = "physicalResource"
        }
    }

    public struct DescribeAppVersionResourcesResolutionStatusRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String
        /// The identifier for a specific resolution.
        public let resolutionId: String?

        @inlinable
        public init(appArn: String, appVersion: String, resolutionId: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.resolutionId = resolutionId
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
            try self.validate(self.resolutionId, name: "resolutionId", parent: name, max: 255)
            try self.validate(self.resolutionId, name: "resolutionId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case resolutionId = "resolutionId"
        }
    }

    public struct DescribeAppVersionResourcesResolutionStatusResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String
        /// The returned error message for the request.
        public let errorMessage: String?
        /// The identifier for a specific resolution.
        public let resolutionId: String
        /// Status of the action.
        public let status: ResourceResolutionStatusType

        @inlinable
        public init(appArn: String, appVersion: String, errorMessage: String? = nil, resolutionId: String, status: ResourceResolutionStatusType) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.errorMessage = errorMessage
            self.resolutionId = resolutionId
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case errorMessage = "errorMessage"
            case resolutionId = "resolutionId"
            case status = "status"
        }
    }

    public struct DescribeAppVersionResponse: AWSDecodableShape {
        /// Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter supports only failover region and account.
        public let additionalInfo: [String: [String]]?
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Resilience Hub application version.
        public let appVersion: String

        @inlinable
        public init(additionalInfo: [String: [String]]? = nil, appArn: String, appVersion: String) {
            self.additionalInfo = additionalInfo
            self.appArn = appArn
            self.appVersion = appVersion
        }

        private enum CodingKeys: String, CodingKey {
            case additionalInfo = "additionalInfo"
            case appArn = "appArn"
            case appVersion = "appVersion"
        }
    }

    public struct DescribeAppVersionTemplateRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String

        @inlinable
        public init(appArn: String, appVersion: String) {
            self.appArn = appArn
            self.appVersion = appVersion
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
        }
    }

    public struct DescribeAppVersionTemplateResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// A JSON string that provides information about your application structure. To learn more about the appTemplateBody template, see the sample template provided in the Examples section. The appTemplateBody JSON string has the following structure:     resources   The list of logical resources that must be included in the Resilience Hub application. Type: Array  Don't add the resources that you want to exclude.  Each resources array item includes the following fields:     logicalResourceId   Logical identifier of the resource. Type: Object Each logicalResourceId object includes the following fields:    identifier  Identifier of the resource. Type: String    logicalStackName  The name of the CloudFormation stack this resource belongs to. Type: String    resourceGroupName  The name of the resource group this resource belongs to. Type: String    terraformSourceName  The name of the Terraform S3 state file this resource belongs to. Type: String    eksSourceName  Name of the Amazon Elastic Kubernetes Service cluster and namespace this resource belongs to.  This parameter accepts values in "eks-cluster/namespace" format.  Type: String       type   The type of resource. Type: string     name   The name of the resource. Type: String    additionalInfo  Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account. Key: "failover-regions"  Value: "[{"region":"&lt;REGION&gt;", "accounts":[{"id":"&lt;ACCOUNT_ID&gt;"}]}]"         appComponents   List of Application Components that this resource belongs to. If an Application Component is not part of the Resilience Hub application, it will be added. Type: Array Each appComponents array item includes the following fields:    name  Name of the Application Component. Type: String    type  Type of Application Component. For more information about the types of Application Component, see Grouping resources in an AppComponent. Type: String    resourceNames  The list of included resources that are assigned to the Application Component. Type: Array of strings    additionalInfo  Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account. Key: "failover-regions"  Value: "[{"region":"&lt;REGION&gt;", "accounts":[{"id":"&lt;ACCOUNT_ID&gt;"}]}]"         excludedResources   The list of logical resource identifiers to be excluded from the application. Type: Array  Don't add the resources that you want to include.  Each excludedResources array item includes the following fields:     logicalResourceIds   Logical identifier of the resource. Type: Object  You can configure only one of the following fields:    logicalStackName     resourceGroupName     terraformSourceName     eksSourceName     Each logicalResourceIds object includes the following fields:    identifier  Identifier of the resource. Type: String    logicalStackName  The name of the CloudFormation stack this resource belongs to. Type: String    resourceGroupName  The name of the resource group this resource belongs to. Type: String    terraformSourceName  The name of the Terraform S3 state file this resource belongs to. Type: String    eksSourceName  Name of the Amazon Elastic Kubernetes Service cluster and namespace this resource belongs to.  This parameter accepts values in "eks-cluster/namespace" format.  Type: String         version   Resilience Hub application version.    additionalInfo  Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account. Key: "failover-regions"  Value: "[{"region":"&lt;REGION&gt;", "accounts":[{"id":"&lt;ACCOUNT_ID&gt;"}]}]"
        public let appTemplateBody: String
        /// The version of the application.
        public let appVersion: String

        @inlinable
        public init(appArn: String, appTemplateBody: String, appVersion: String) {
            self.appArn = appArn
            self.appTemplateBody = appTemplateBody
            self.appVersion = appVersion
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appTemplateBody = "appTemplateBody"
            case appVersion = "appVersion"
        }
    }

    public struct DescribeDraftAppVersionResourcesImportStatusRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String

        @inlinable
        public init(appArn: String) {
            self.appArn = appArn
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
        }
    }

    public struct DescribeDraftAppVersionResourcesImportStatusResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String
        /// List of errors that were encountered while importing resources.
        public let errorDetails: [ErrorDetail]?
        /// The error message returned for the resource request.
        public let errorMessage: String?
        /// Status of the action.
        public let status: ResourceImportStatusType
        /// The time when the status last changed.
        public let statusChangeTime: Date

        @inlinable
        public init(appArn: String, appVersion: String, errorDetails: [ErrorDetail]? = nil, errorMessage: String? = nil, status: ResourceImportStatusType, statusChangeTime: Date) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.errorDetails = errorDetails
            self.errorMessage = errorMessage
            self.status = status
            self.statusChangeTime = statusChangeTime
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case errorDetails = "errorDetails"
            case errorMessage = "errorMessage"
            case status = "status"
            case statusChangeTime = "statusChangeTime"
        }
    }

    public struct DescribeMetricsExportRequest: AWSEncodableShape {
        /// Identifier of the metrics export task.
        public let metricsExportId: String

        @inlinable
        public init(metricsExportId: String) {
            self.metricsExportId = metricsExportId
        }

        public func validate(name: String) throws {
            try self.validate(self.metricsExportId, name: "metricsExportId", parent: name, max: 255)
            try self.validate(self.metricsExportId, name: "metricsExportId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case metricsExportId = "metricsExportId"
        }
    }

    public struct DescribeMetricsExportResponse: AWSDecodableShape {
        /// Explains the error that occurred while exporting the metrics.
        public let errorMessage: String?
        /// Specifies the name of the Amazon S3 bucket where the exported metrics is stored.
        public let exportLocation: S3Location?
        /// Identifier for the metrics export task.
        public let metricsExportId: String
        /// Indicates the status of the metrics export task.
        public let status: MetricsExportStatusType

        @inlinable
        public init(errorMessage: String? = nil, exportLocation: S3Location? = nil, metricsExportId: String, status: MetricsExportStatusType) {
            self.errorMessage = errorMessage
            self.exportLocation = exportLocation
            self.metricsExportId = metricsExportId
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case errorMessage = "errorMessage"
            case exportLocation = "exportLocation"
            case metricsExportId = "metricsExportId"
            case status = "status"
        }
    }

    public struct DescribeResiliencyPolicyRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the resiliency policy. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:resiliency-policy/policy-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let policyArn: String

        @inlinable
        public init(policyArn: String) {
            self.policyArn = policyArn
        }

        public func validate(name: String) throws {
            try self.validate(self.policyArn, name: "policyArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: String, CodingKey {
            case policyArn = "policyArn"
        }
    }

    public struct DescribeResiliencyPolicyResponse: AWSDecodableShape {
        /// Information about the specific resiliency policy, returned as an object. This object includes creation time, data location constraints, its name, description, tags, the recovery time objective (RTO) and recovery point objective (RPO) in seconds, and more.
        public let policy: ResiliencyPolicy

        @inlinable
        public init(policy: ResiliencyPolicy) {
            self.policy = policy
        }

        private enum CodingKeys: String, CodingKey {
            case policy = "policy"
        }
    }

    public struct DescribeResourceGroupingRecommendationTaskRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Identifier of the grouping recommendation task.
        public let groupingId: String?

        @inlinable
        public init(appArn: String, groupingId: String? = nil) {
            self.appArn = appArn
            self.groupingId = groupingId
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.groupingId, name: "groupingId", parent: name, max: 255)
            try self.validate(self.groupingId, name: "groupingId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case groupingId = "groupingId"
        }
    }

    public struct DescribeResourceGroupingRecommendationTaskResponse: AWSDecodableShape {
        /// Error that occurred while generating a grouping recommendation.
        public let errorMessage: String?
        /// Identifier of the grouping recommendation task.
        public let groupingId: String
        /// Status of the action.
        public let status: ResourcesGroupingRecGenStatusType

        @inlinable
        public init(errorMessage: String? = nil, groupingId: String, status: ResourcesGroupingRecGenStatusType) {
            self.errorMessage = errorMessage
            self.groupingId = groupingId
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case errorMessage = "errorMessage"
            case groupingId = "groupingId"
            case status = "status"
        }
    }

    public struct DisruptionCompliance: AWSDecodableShape {
        /// The Recovery Point Objective (RPO) that is achievable, in seconds.
        public let achievableRpoInSecs: Int?
        /// The Recovery Time Objective (RTO) that is achievable, in seconds
        public let achievableRtoInSecs: Int?
        /// The current status of compliance for the resiliency policy.
        public let complianceStatus: ComplianceStatus
        /// The current RPO, in seconds.
        public let currentRpoInSecs: Int?
        /// The current RTO, in seconds.
        public let currentRtoInSecs: Int?
        /// The disruption compliance message.
        public let message: String?
        /// The RPO description.
        public let rpoDescription: String?
        /// Reference identifier of the RPO .
        public let rpoReferenceId: String?
        /// The RTO description.
        public let rtoDescription: String?
        /// Reference identifier of the RTO.
        public let rtoReferenceId: String?

        @inlinable
        public init(achievableRpoInSecs: Int? = nil, achievableRtoInSecs: Int? = nil, complianceStatus: ComplianceStatus, currentRpoInSecs: Int? = nil, currentRtoInSecs: Int? = nil, message: String? = nil, rpoDescription: String? = nil, rpoReferenceId: String? = nil, rtoDescription: String? = nil, rtoReferenceId: String? = nil) {
            self.achievableRpoInSecs = achievableRpoInSecs
            self.achievableRtoInSecs = achievableRtoInSecs
            self.complianceStatus = complianceStatus
            self.currentRpoInSecs = currentRpoInSecs
            self.currentRtoInSecs = currentRtoInSecs
            self.message = message
            self.rpoDescription = rpoDescription
            self.rpoReferenceId = rpoReferenceId
            self.rtoDescription = rtoDescription
            self.rtoReferenceId = rtoReferenceId
        }

        private enum CodingKeys: String, CodingKey {
            case achievableRpoInSecs = "achievableRpoInSecs"
            case achievableRtoInSecs = "achievableRtoInSecs"
            case complianceStatus = "complianceStatus"
            case currentRpoInSecs = "currentRpoInSecs"
            case currentRtoInSecs = "currentRtoInSecs"
            case message = "message"
            case rpoDescription = "rpoDescription"
            case rpoReferenceId = "rpoReferenceId"
            case rtoDescription = "rtoDescription"
            case rtoReferenceId = "rtoReferenceId"
        }
    }

    public struct EksSource: AWSEncodableShape & AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Amazon Elastic Kubernetes Service cluster. The format for this ARN is:
        /// arn:aws:eks:region:account-id:cluster/cluster-name. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let eksClusterArn: String
        /// The list of namespaces located on your Amazon Elastic Kubernetes Service cluster.
        public let namespaces: [String]

        @inlinable
        public init(eksClusterArn: String, namespaces: [String]) {
            self.eksClusterArn = eksClusterArn
            self.namespaces = namespaces
        }

        public func validate(name: String) throws {
            try self.validate(self.eksClusterArn, name: "eksClusterArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.namespaces.forEach {
                try validate($0, name: "namespaces[]", parent: name, max: 63)
                try validate($0, name: "namespaces[]", parent: name, min: 1)
                try validate($0, name: "namespaces[]", parent: name, pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case eksClusterArn = "eksClusterArn"
            case namespaces = "namespaces"
        }
    }

    public struct EksSourceClusterNamespace: AWSEncodableShape & AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Amazon Elastic Kubernetes Service cluster. The format for this ARN is:
        /// arn:aws:eks:region:account-id:cluster/cluster-name. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let eksClusterArn: String
        /// Name of the namespace that is located on your Amazon Elastic Kubernetes Service cluster.
        public let namespace: String

        @inlinable
        public init(eksClusterArn: String, namespace: String) {
            self.eksClusterArn = eksClusterArn
            self.namespace = namespace
        }

        public func validate(name: String) throws {
            try self.validate(self.eksClusterArn, name: "eksClusterArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.namespace, name: "namespace", parent: name, max: 63)
            try self.validate(self.namespace, name: "namespace", parent: name, min: 1)
            try self.validate(self.namespace, name: "namespace", parent: name, pattern: "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$")
        }

        private enum CodingKeys: String, CodingKey {
            case eksClusterArn = "eksClusterArn"
            case namespace = "namespace"
        }
    }

    public struct ErrorDetail: AWSDecodableShape {
        /// Provides additional information about the error.
        public let errorMessage: String?

        @inlinable
        public init(errorMessage: String? = nil) {
            self.errorMessage = errorMessage
        }

        private enum CodingKeys: String, CodingKey {
            case errorMessage = "errorMessage"
        }
    }

    public struct EventSubscription: AWSEncodableShape & AWSDecodableShape {
        /// The type of event you would like to subscribe and get notification for. Currently, Resilience Hub supports notifications only for Drift detected (DriftDetected) and Scheduled assessment failure (ScheduledAssessmentFailure) events.
        public let eventType: EventType
        /// Unique name to identify an event subscription.
        public let name: String
        /// Amazon Resource Name (ARN) of the Amazon Simple Notification Service topic. The format for this ARN is: arn:partition:sns:region:account:topic-name. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let snsTopicArn: String?

        @inlinable
        public init(eventType: EventType, name: String, snsTopicArn: String? = nil) {
            self.eventType = eventType
            self.name = name
            self.snsTopicArn = snsTopicArn
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 255)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.snsTopicArn, name: "snsTopicArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: String, CodingKey {
            case eventType = "eventType"
            case name = "name"
            case snsTopicArn = "snsTopicArn"
        }
    }

    public struct Experiment: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the FIS experiment.
        public let experimentArn: String?
        /// Identifier of the FIS experiment template.
        public let experimentTemplateId: String?

        @inlinable
        public init(experimentArn: String? = nil, experimentTemplateId: String? = nil) {
            self.experimentArn = experimentArn
            self.experimentTemplateId = experimentTemplateId
        }

        private enum CodingKeys: String, CodingKey {
            case experimentArn = "experimentArn"
            case experimentTemplateId = "experimentTemplateId"
        }
    }

    public struct FailedGroupingRecommendationEntry: AWSDecodableShape {
        /// Indicates the error that occurred while implementing a grouping recommendation.
        public let errorMessage: String
        /// Indicates the identifier of the grouping recommendation.
        public let groupingRecommendationId: String

        @inlinable
        public init(errorMessage: String, groupingRecommendationId: String) {
            self.errorMessage = errorMessage
            self.groupingRecommendationId = groupingRecommendationId
        }

        private enum CodingKeys: String, CodingKey {
            case errorMessage = "errorMessage"
            case groupingRecommendationId = "groupingRecommendationId"
        }
    }

    public struct FailurePolicy: AWSEncodableShape & AWSDecodableShape {
        /// Recovery Point Objective (RPO) in seconds.
        public let rpoInSecs: Int
        /// Recovery Time Objective (RTO) in seconds.
        public let rtoInSecs: Int

        @inlinable
        public init(rpoInSecs: Int, rtoInSecs: Int) {
            self.rpoInSecs = rpoInSecs
            self.rtoInSecs = rtoInSecs
        }

        public func validate(name: String) throws {
            try self.validate(self.rpoInSecs, name: "rpoInSecs", parent: name, min: 0)
            try self.validate(self.rtoInSecs, name: "rtoInSecs", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case rpoInSecs = "rpoInSecs"
            case rtoInSecs = "rtoInSecs"
        }
    }

    public struct Field: AWSEncodableShape {
        /// (Optional) Indicates the type of aggregation or summary operation (such as Sum, Average, and so on) to be performed on a particular field or set of data.
        public let aggregation: FieldAggregationType?
        /// Name of the field.
        public let name: String

        @inlinable
        public init(aggregation: FieldAggregationType? = nil, name: String) {
            self.aggregation = aggregation
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 255)
            try self.validate(self.name, name: "name", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case aggregation = "aggregation"
            case name = "name"
        }
    }

    public struct GroupingAppComponent: AWSDecodableShape {
        /// Indicates the identifier of an AppComponent.
        public let appComponentId: String
        /// Indicates the name of an AppComponent.
        public let appComponentName: String
        /// Indicates the type of an AppComponent.
        public let appComponentType: String

        @inlinable
        public init(appComponentId: String, appComponentName: String, appComponentType: String) {
            self.appComponentId = appComponentId
            self.appComponentName = appComponentName
            self.appComponentType = appComponentType
        }

        private enum CodingKeys: String, CodingKey {
            case appComponentId = "appComponentId"
            case appComponentName = "appComponentName"
            case appComponentType = "appComponentType"
        }
    }

    public struct GroupingRecommendation: AWSDecodableShape {
        /// Indicates the confidence level of Resilience Hub on the grouping recommendation.
        public let confidenceLevel: GroupingRecommendationConfidenceLevel
        /// Indicates the creation time of the grouping recommendation.
        public let creationTime: Date
        /// Indicates the name of the recommended Application Component (AppComponent).
        public let groupingAppComponent: GroupingAppComponent
        /// Indicates all the reasons available for rejecting a grouping recommendation.
        public let groupingRecommendationId: String
        /// Indicates all the reasons available for rejecting a grouping recommendation.
        public let recommendationReasons: [String]
        /// Indicates the reason you had selected while rejecting a grouping recommendation.
        public let rejectionReason: GroupingRecommendationRejectionReason?
        /// Indicates the resources that are grouped in a recommended AppComponent.
        public let resources: [GroupingResource]
        /// Indicates the confidence level of the grouping recommendation.
        public let score: Double
        /// Indicates the status of grouping resources into AppComponents.
        public let status: GroupingRecommendationStatusType

        @inlinable
        public init(confidenceLevel: GroupingRecommendationConfidenceLevel, creationTime: Date, groupingAppComponent: GroupingAppComponent, groupingRecommendationId: String, recommendationReasons: [String], rejectionReason: GroupingRecommendationRejectionReason? = nil, resources: [GroupingResource], score: Double, status: GroupingRecommendationStatusType) {
            self.confidenceLevel = confidenceLevel
            self.creationTime = creationTime
            self.groupingAppComponent = groupingAppComponent
            self.groupingRecommendationId = groupingRecommendationId
            self.recommendationReasons = recommendationReasons
            self.rejectionReason = rejectionReason
            self.resources = resources
            self.score = score
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case confidenceLevel = "confidenceLevel"
            case creationTime = "creationTime"
            case groupingAppComponent = "groupingAppComponent"
            case groupingRecommendationId = "groupingRecommendationId"
            case recommendationReasons = "recommendationReasons"
            case rejectionReason = "rejectionReason"
            case resources = "resources"
            case score = "score"
            case status = "status"
        }
    }

    public struct GroupingResource: AWSDecodableShape {
        /// Indicates the logical identifier of the resource.
        public let logicalResourceId: LogicalResourceId
        /// Indicates the physical identifier of the resource.
        public let physicalResourceId: PhysicalResourceId
        /// Indicates the resource name.
        public let resourceName: String
        /// Indicates the resource type.
        public let resourceType: String
        /// Indicates the identifier of the source AppComponents in which the resources were previously grouped into.
        public let sourceAppComponentIds: [String]

        @inlinable
        public init(logicalResourceId: LogicalResourceId, physicalResourceId: PhysicalResourceId, resourceName: String, resourceType: String, sourceAppComponentIds: [String]) {
            self.logicalResourceId = logicalResourceId
            self.physicalResourceId = physicalResourceId
            self.resourceName = resourceName
            self.resourceType = resourceType
            self.sourceAppComponentIds = sourceAppComponentIds
        }

        private enum CodingKeys: String, CodingKey {
            case logicalResourceId = "logicalResourceId"
            case physicalResourceId = "physicalResourceId"
            case resourceName = "resourceName"
            case resourceType = "resourceType"
            case sourceAppComponentIds = "sourceAppComponentIds"
        }
    }

    public struct ImportResourcesToDraftAppVersionRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The input sources of the Amazon Elastic Kubernetes Service resources you need to import.
        public let eksSources: [EksSource]?
        /// The import strategy you would like to set to import resources into Resilience Hub application.
        public let importStrategy: ResourceImportStrategyType?
        /// The Amazon Resource Names (ARNs) for the resources.
        public let sourceArns: [String]?
        ///  A list of terraform file s3 URLs you need to import.
        public let terraformSources: [TerraformSource]?

        @inlinable
        public init(appArn: String, eksSources: [EksSource]? = nil, importStrategy: ResourceImportStrategyType? = nil, sourceArns: [String]? = nil, terraformSources: [TerraformSource]? = nil) {
            self.appArn = appArn
            self.eksSources = eksSources
            self.importStrategy = importStrategy
            self.sourceArns = sourceArns
            self.terraformSources = terraformSources
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.eksSources?.forEach {
                try $0.validate(name: "\(name).eksSources[]")
            }
            try self.sourceArns?.forEach {
                try validate($0, name: "sourceArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            }
            try self.terraformSources?.forEach {
                try $0.validate(name: "\(name).terraformSources[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case eksSources = "eksSources"
            case importStrategy = "importStrategy"
            case sourceArns = "sourceArns"
            case terraformSources = "terraformSources"
        }
    }

    public struct ImportResourcesToDraftAppVersionResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String
        /// The input sources of the Amazon Elastic Kubernetes Service resources you have imported.
        public let eksSources: [EksSource]?
        /// The Amazon Resource Names (ARNs) for the resources you have imported.
        public let sourceArns: [String]?
        /// Status of the action.
        public let status: ResourceImportStatusType
        ///  A list of terraform file s3 URLs you have imported.
        public let terraformSources: [TerraformSource]?

        @inlinable
        public init(appArn: String, appVersion: String, eksSources: [EksSource]? = nil, sourceArns: [String]? = nil, status: ResourceImportStatusType, terraformSources: [TerraformSource]? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.eksSources = eksSources
            self.sourceArns = sourceArns
            self.status = status
            self.terraformSources = terraformSources
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case eksSources = "eksSources"
            case sourceArns = "sourceArns"
            case status = "status"
            case terraformSources = "terraformSources"
        }
    }

    public struct ListAlarmRecommendationsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(assessmentArn: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.assessmentArn = assessmentArn
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
        }
    }

    public struct ListAlarmRecommendationsResponse: AWSDecodableShape {
        /// The alarm recommendations for an Resilience Hub application, returned as an object. This object includes Application Component names, descriptions, information about whether a recommendation has already been implemented or not, prerequisites, and more.
        public let alarmRecommendations: [AlarmRecommendation]
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?

        @inlinable
        public init(alarmRecommendations: [AlarmRecommendation], nextToken: String? = nil) {
            self.alarmRecommendations = alarmRecommendations
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case alarmRecommendations = "alarmRecommendations"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppAssessmentComplianceDriftsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// Maximum number of compliance drifts requested.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(assessmentArn: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.assessmentArn = assessmentArn
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppAssessmentComplianceDriftsResponse: AWSDecodableShape {
        /// Indicates compliance drifts (recovery time objective (RTO) and recovery point objective (RPO)) detected for an assessed entity.
        public let complianceDrifts: [ComplianceDrift]
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(complianceDrifts: [ComplianceDrift], nextToken: String? = nil) {
            self.complianceDrifts = complianceDrifts
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case complianceDrifts = "complianceDrifts"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppAssessmentResourceDriftsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// Maximum number of drift results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(assessmentArn: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.assessmentArn = assessmentArn
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppAssessmentResourceDriftsResponse: AWSDecodableShape {
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?
        /// Indicates all the resource drifts detected for an assessed entity.
        public let resourceDrifts: [ResourceDrift]

        @inlinable
        public init(nextToken: String? = nil, resourceDrifts: [ResourceDrift]) {
            self.nextToken = nextToken
            self.resourceDrifts = resourceDrifts
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "nextToken"
            case resourceDrifts = "resourceDrifts"
        }
    }

    public struct ListAppAssessmentsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String?
        /// The name for the assessment.
        public let assessmentName: String?
        /// The current status of the assessment for the resiliency policy.
        public let assessmentStatus: [AssessmentStatus]?
        /// The current status of compliance for the resiliency policy.
        public let complianceStatus: ComplianceStatus?
        /// Specifies the entity that invoked a specific assessment, either a User or the System.
        public let invoker: AssessmentInvoker?
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?
        /// The default is to sort by ascending startTime.
        /// To sort by descending startTime, set reverseOrder to true.
        public let reverseOrder: Bool?

        @inlinable
        public init(appArn: String? = nil, assessmentName: String? = nil, assessmentStatus: [AssessmentStatus]? = nil, complianceStatus: ComplianceStatus? = nil, invoker: AssessmentInvoker? = nil, maxResults: Int? = nil, nextToken: String? = nil, reverseOrder: Bool? = nil) {
            self.appArn = appArn
            self.assessmentName = assessmentName
            self.assessmentStatus = assessmentStatus
            self.complianceStatus = complianceStatus
            self.invoker = invoker
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.reverseOrder = reverseOrder
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodeQuery(self.appArn, key: "appArn")
            request.encodeQuery(self.assessmentName, key: "assessmentName")
            request.encodeQuery(self.assessmentStatus, key: "assessmentStatus")
            request.encodeQuery(self.complianceStatus, key: "complianceStatus")
            request.encodeQuery(self.invoker, key: "invoker")
            request.encodeQuery(self.maxResults, key: "maxResults")
            request.encodeQuery(self.nextToken, key: "nextToken")
            request.encodeQuery(self.reverseOrder, key: "reverseOrder")
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.assessmentName, name: "assessmentName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.assessmentStatus, name: "assessmentStatus", parent: name, max: 10)
            try self.validate(self.assessmentStatus, name: "assessmentStatus", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListAppAssessmentsResponse: AWSDecodableShape {
        /// The summaries for the specified assessments, returned as an object. This object includes application versions, associated Amazon Resource Numbers (ARNs), cost, messages, resiliency scores, and more.
        public let assessmentSummaries: [AppAssessmentSummary]
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?

        @inlinable
        public init(assessmentSummaries: [AppAssessmentSummary], nextToken: String? = nil) {
            self.assessmentSummaries = assessmentSummaries
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentSummaries = "assessmentSummaries"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppComponentCompliancesRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(assessmentArn: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.assessmentArn = assessmentArn
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppComponentCompliancesResponse: AWSDecodableShape {
        /// The compliances for an Resilience Hub Application Component, returned as an object. This object contains the names of the Application Components, compliances, costs, resiliency scores, outage scores, and more.
        public let componentCompliances: [AppComponentCompliance]
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?

        @inlinable
        public init(componentCompliances: [AppComponentCompliance], nextToken: String? = nil) {
            self.componentCompliances = componentCompliances
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case componentCompliances = "componentCompliances"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppComponentRecommendationsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(assessmentArn: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.assessmentArn = assessmentArn
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppComponentRecommendationsResponse: AWSDecodableShape {
        /// The recommendations for an Resilience Hub Application Component, returned as an object. This object contains the names of the Application Components, configuration recommendations, and recommendation statuses.
        public let componentRecommendations: [ComponentRecommendation]
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?

        @inlinable
        public init(componentRecommendations: [ComponentRecommendation], nextToken: String? = nil) {
            self.componentRecommendations = componentRecommendations
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case componentRecommendations = "componentRecommendations"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppInputSourcesRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Resilience Hub application version.
        public let appVersion: String
        /// Maximum number of input sources to be displayed per Resilience Hub application.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(appArn: String, appVersion: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppInputSourcesResponse: AWSDecodableShape {
        /// The list of Resilience Hub application input sources.
        public let appInputSources: [AppInputSource]
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?

        @inlinable
        public init(appInputSources: [AppInputSource], nextToken: String? = nil) {
            self.appInputSources = appInputSources
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case appInputSources = "appInputSources"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppVersionAppComponentsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Version of the Application Component.
        public let appVersion: String
        /// Maximum number of Application Components to be displayed per Resilience Hub application version.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(appArn: String, appVersion: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppVersionAppComponentsResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Defines an Application Component.
        public let appComponents: [AppComponent]?
        /// Resilience Hub application version.
        public let appVersion: String
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?

        @inlinable
        public init(appArn: String, appComponents: [AppComponent]? = nil, appVersion: String, nextToken: String? = nil) {
            self.appArn = appArn
            self.appComponents = appComponents
            self.appVersion = appVersion
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appComponents = "appComponents"
            case appVersion = "appVersion"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppVersionResourceMappingsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(appArn: String, appVersion: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppVersionResourceMappingsResponse: AWSDecodableShape {
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?
        /// Mappings used to map logical resources from the template to physical resources. You can use the mapping type CFN_STACK if the application template uses a logical stack name. Or you can map individual resources by using the mapping type RESOURCE. We recommend using the mapping type CFN_STACK if the application is backed by a CloudFormation stack.
        public let resourceMappings: [ResourceMapping]

        @inlinable
        public init(nextToken: String? = nil, resourceMappings: [ResourceMapping]) {
            self.nextToken = nextToken
            self.resourceMappings = resourceMappings
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "nextToken"
            case resourceMappings = "resourceMappings"
        }
    }

    public struct ListAppVersionResourcesRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?
        /// The identifier for a specific resolution.
        public let resolutionId: String?

        @inlinable
        public init(appArn: String, appVersion: String, maxResults: Int? = nil, nextToken: String? = nil, resolutionId: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.resolutionId = resolutionId
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
            try self.validate(self.resolutionId, name: "resolutionId", parent: name, max: 255)
            try self.validate(self.resolutionId, name: "resolutionId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
            case resolutionId = "resolutionId"
        }
    }

    public struct ListAppVersionResourcesResponse: AWSDecodableShape {
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?
        /// The physical resources in the application version.
        public let physicalResources: [PhysicalResource]
        /// The ID for a specific resolution.
        public let resolutionId: String

        @inlinable
        public init(nextToken: String? = nil, physicalResources: [PhysicalResource], resolutionId: String) {
            self.nextToken = nextToken
            self.physicalResources = physicalResources
            self.resolutionId = resolutionId
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "nextToken"
            case physicalResources = "physicalResources"
            case resolutionId = "resolutionId"
        }
    }

    public struct ListAppVersionsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Upper limit of the time range to filter the application versions.
        public let endTime: Date?
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?
        /// Lower limit of the time range to filter the application versions.
        public let startTime: Date?

        @inlinable
        public init(appArn: String, endTime: Date? = nil, maxResults: Int? = nil, nextToken: String? = nil, startTime: Date? = nil) {
            self.appArn = appArn
            self.endTime = endTime
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.startTime = startTime
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case endTime = "endTime"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
            case startTime = "startTime"
        }
    }

    public struct ListAppVersionsResponse: AWSDecodableShape {
        /// The version of the application.
        public let appVersions: [AppVersionSummary]
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?

        @inlinable
        public init(appVersions: [AppVersionSummary], nextToken: String? = nil) {
            self.appVersions = appVersions
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case appVersions = "appVersions"
            case nextToken = "nextToken"
        }
    }

    public struct ListAppsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String?
        /// Amazon Resource Name (ARN) of  Resource Groups group that is integrated with an AppRegistry application. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let awsApplicationArn: String?
        /// Lower limit of the range that is used to filter applications based on their last assessment times.
        public let fromLastAssessmentTime: Date?
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// The name for the one of the listed applications.
        public let name: String?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?
        /// The application list is sorted based on the values of lastAppComplianceEvaluationTime field. By default, application list is sorted in ascending order. To sort the application list in descending order, set this field to True.
        public let reverseOrder: Bool?
        /// Upper limit of the range that is used to filter the applications based on their last assessment times.
        public let toLastAssessmentTime: Date?

        @inlinable
        public init(appArn: String? = nil, awsApplicationArn: String? = nil, fromLastAssessmentTime: Date? = nil, maxResults: Int? = nil, name: String? = nil, nextToken: String? = nil, reverseOrder: Bool? = nil, toLastAssessmentTime: Date? = nil) {
            self.appArn = appArn
            self.awsApplicationArn = awsApplicationArn
            self.fromLastAssessmentTime = fromLastAssessmentTime
            self.maxResults = maxResults
            self.name = name
            self.nextToken = nextToken
            self.reverseOrder = reverseOrder
            self.toLastAssessmentTime = toLastAssessmentTime
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodeQuery(self.appArn, key: "appArn")
            request.encodeQuery(self.awsApplicationArn, key: "awsApplicationArn")
            request.encodeQuery(self.fromLastAssessmentTime, key: "fromLastAssessmentTime")
            request.encodeQuery(self.maxResults, key: "maxResults")
            request.encodeQuery(self.name, key: "name")
            request.encodeQuery(self.nextToken, key: "nextToken")
            request.encodeQuery(self.reverseOrder, key: "reverseOrder")
            request.encodeQuery(self.toLastAssessmentTime, key: "toLastAssessmentTime")
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.awsApplicationArn, name: "awsApplicationArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListAppsResponse: AWSDecodableShape {
        /// Summaries for the Resilience Hub application.
        public let appSummaries: [AppSummary]
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?

        @inlinable
        public init(appSummaries: [AppSummary], nextToken: String? = nil) {
            self.appSummaries = appSummaries
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case appSummaries = "appSummaries"
            case nextToken = "nextToken"
        }
    }

    public struct ListMetricsRequest: AWSEncodableShape {
        /// Indicates the list of all the conditions that were applied on the metrics.
        public let conditions: [Condition]?
        /// Indicates the data source of the metrics.
        public let dataSource: String?
        /// Indicates the list of fields in the data source.
        public let fields: [Field]?
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?
        /// (Optional) Indicates the order in which you want to sort the fields in the metrics. By default, the fields are sorted in the ascending order.
        public let sorts: [Sort]?

        @inlinable
        public init(conditions: [Condition]? = nil, dataSource: String? = nil, fields: [Field]? = nil, maxResults: Int? = nil, nextToken: String? = nil, sorts: [Sort]? = nil) {
            self.conditions = conditions
            self.dataSource = dataSource
            self.fields = fields
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.sorts = sorts
        }

        public func validate(name: String) throws {
            try self.conditions?.forEach {
                try $0.validate(name: "\(name).conditions[]")
            }
            try self.validate(self.conditions, name: "conditions", parent: name, max: 50)
            try self.validate(self.dataSource, name: "dataSource", parent: name, max: 255)
            try self.validate(self.dataSource, name: "dataSource", parent: name, min: 1)
            try self.fields?.forEach {
                try $0.validate(name: "\(name).fields[]")
            }
            try self.validate(self.fields, name: "fields", parent: name, max: 50)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
            try self.sorts?.forEach {
                try $0.validate(name: "\(name).sorts[]")
            }
            try self.validate(self.sorts, name: "sorts", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case conditions = "conditions"
            case dataSource = "dataSource"
            case fields = "fields"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
            case sorts = "sorts"
        }
    }

    public struct ListMetricsResponse: AWSDecodableShape {
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?
        /// Specifies all the list of metric values for each row of metrics.
        public let rows: [[String]]

        @inlinable
        public init(nextToken: String? = nil, rows: [[String]]) {
            self.nextToken = nextToken
            self.rows = rows
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "nextToken"
            case rows = "rows"
        }
    }

    public struct ListRecommendationTemplatesRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String?
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// The name for one of the listed recommendation templates.
        public let name: String?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?
        /// The Amazon Resource Name (ARN) for a recommendation template.
        public let recommendationTemplateArn: String?
        /// The default is to sort by ascending startTime.
        /// To sort by descending startTime, set reverseOrder to true.
        public let reverseOrder: Bool?
        /// Status of the action.
        public let status: [RecommendationTemplateStatus]?

        @inlinable
        public init(assessmentArn: String? = nil, maxResults: Int? = nil, name: String? = nil, nextToken: String? = nil, recommendationTemplateArn: String? = nil, reverseOrder: Bool? = nil, status: [RecommendationTemplateStatus]? = nil) {
            self.assessmentArn = assessmentArn
            self.maxResults = maxResults
            self.name = name
            self.nextToken = nextToken
            self.recommendationTemplateArn = recommendationTemplateArn
            self.reverseOrder = reverseOrder
            self.status = status
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodeQuery(self.assessmentArn, key: "assessmentArn")
            request.encodeQuery(self.maxResults, key: "maxResults")
            request.encodeQuery(self.name, key: "name")
            request.encodeQuery(self.nextToken, key: "nextToken")
            request.encodeQuery(self.recommendationTemplateArn, key: "recommendationTemplateArn")
            request.encodeQuery(self.reverseOrder, key: "reverseOrder")
            request.encodeQuery(self.status, key: "status")
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
            try self.validate(self.recommendationTemplateArn, name: "recommendationTemplateArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.status, name: "status", parent: name, max: 4)
            try self.validate(self.status, name: "status", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListRecommendationTemplatesResponse: AWSDecodableShape {
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?
        /// The recommendation templates for the Resilience Hub applications.
        public let recommendationTemplates: [RecommendationTemplate]?

        @inlinable
        public init(nextToken: String? = nil, recommendationTemplates: [RecommendationTemplate]? = nil) {
            self.nextToken = nextToken
            self.recommendationTemplates = recommendationTemplates
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "nextToken"
            case recommendationTemplates = "recommendationTemplates"
        }
    }

    public struct ListResiliencyPoliciesRequest: AWSEncodableShape {
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?
        /// Name of the resiliency policy.
        public let policyName: String?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, policyName: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.policyName = policyName
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodeQuery(self.maxResults, key: "maxResults")
            request.encodeQuery(self.nextToken, key: "nextToken")
            request.encodeQuery(self.policyName, key: "policyName")
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListResiliencyPoliciesResponse: AWSDecodableShape {
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?
        /// The resiliency policies for the Resilience Hub applications.
        public let resiliencyPolicies: [ResiliencyPolicy]

        @inlinable
        public init(nextToken: String? = nil, resiliencyPolicies: [ResiliencyPolicy]) {
            self.nextToken = nextToken
            self.resiliencyPolicies = resiliencyPolicies
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "nextToken"
            case resiliencyPolicies = "resiliencyPolicies"
        }
    }

    public struct ListResourceGroupingRecommendationsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String?
        /// Maximum number of grouping recommendations to be displayed per Resilience Hub application.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(appArn: String? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.appArn = appArn
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodeQuery(self.appArn, key: "appArn")
            request.encodeQuery(self.maxResults, key: "maxResults")
            request.encodeQuery(self.nextToken, key: "nextToken")
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListResourceGroupingRecommendationsResponse: AWSDecodableShape {
        /// List of resource grouping recommendations generated by Resilience Hub.
        public let groupingRecommendations: [GroupingRecommendation]
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(groupingRecommendations: [GroupingRecommendation], nextToken: String? = nil) {
            self.groupingRecommendations = groupingRecommendations
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case groupingRecommendations = "groupingRecommendations"
            case nextToken = "nextToken"
        }
    }

    public struct ListSopRecommendationsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(assessmentArn: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.assessmentArn = assessmentArn
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
        }
    }

    public struct ListSopRecommendationsResponse: AWSDecodableShape {
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?
        /// The standard operating procedure (SOP) recommendations for the Resilience Hub applications.
        public let sopRecommendations: [SopRecommendation]

        @inlinable
        public init(nextToken: String? = nil, sopRecommendations: [SopRecommendation]) {
            self.nextToken = nextToken
            self.sopRecommendations = sopRecommendations
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "nextToken"
            case sopRecommendations = "sopRecommendations"
        }
    }

    public struct ListSuggestedResiliencyPoliciesRequest: AWSEncodableShape {
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodeQuery(self.maxResults, key: "maxResults")
            request.encodeQuery(self.nextToken, key: "nextToken")
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListSuggestedResiliencyPoliciesResponse: AWSDecodableShape {
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?
        /// The suggested resiliency policies for the Resilience Hub applications.
        public let resiliencyPolicies: [ResiliencyPolicy]

        @inlinable
        public init(nextToken: String? = nil, resiliencyPolicies: [ResiliencyPolicy]) {
            self.nextToken = nextToken
            self.resiliencyPolicies = resiliencyPolicies
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "nextToken"
            case resiliencyPolicies = "resiliencyPolicies"
        }
    }

    public struct ListTagsForResourceRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) for a specific resource in your Resilience Hub application.
        public let resourceArn: String

        @inlinable
        public init(resourceArn: String) {
            self.resourceArn = resourceArn
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.resourceArn, key: "resourceArn")
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListTagsForResourceResponse: AWSDecodableShape {
        /// Tags assigned to the resource. A tag is a label that you assign to an Amazon Web Services resource.
        /// Each tag consists of a key/value pair.
        public let tags: [String: String]?

        @inlinable
        public init(tags: [String: String]? = nil) {
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "tags"
        }
    }

    public struct ListTestRecommendationsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?

        @inlinable
        public init(assessmentArn: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.assessmentArn = assessmentArn
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.assessmentArn, name: "assessmentArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case assessmentArn = "assessmentArn"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
        }
    }

    public struct ListTestRecommendationsResponse: AWSDecodableShape {
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?
        /// The test recommendations for the Resilience Hub application.
        public let testRecommendations: [TestRecommendation]

        @inlinable
        public init(nextToken: String? = nil, testRecommendations: [TestRecommendation]) {
            self.nextToken = nextToken
            self.testRecommendations = testRecommendations
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "nextToken"
            case testRecommendations = "testRecommendations"
        }
    }

    public struct ListUnsupportedAppVersionResourcesRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String
        /// Maximum number of results to include in the response. If more results exist than the specified
        /// MaxResults value, a token is included in the response so that the remaining results can be retrieved.
        public let maxResults: Int?
        /// Null, or the token from a previous call to get the next set of results.
        public let nextToken: String?
        /// The identifier for a specific resolution.
        public let resolutionId: String?

        @inlinable
        public init(appArn: String, appVersion: String, maxResults: Int? = nil, nextToken: String? = nil, resolutionId: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.resolutionId = resolutionId
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^\\S{1,2000}$")
            try self.validate(self.resolutionId, name: "resolutionId", parent: name, max: 255)
            try self.validate(self.resolutionId, name: "resolutionId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case maxResults = "maxResults"
            case nextToken = "nextToken"
            case resolutionId = "resolutionId"
        }
    }

    public struct ListUnsupportedAppVersionResourcesResponse: AWSDecodableShape {
        /// Token for the next set of results, or null if there are no more results.
        public let nextToken: String?
        /// The identifier for a specific resolution.
        public let resolutionId: String
        /// The unsupported resources for the application.
        public let unsupportedResources: [UnsupportedResource]

        @inlinable
        public init(nextToken: String? = nil, resolutionId: String, unsupportedResources: [UnsupportedResource]) {
            self.nextToken = nextToken
            self.resolutionId = resolutionId
            self.unsupportedResources = unsupportedResources
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "nextToken"
            case resolutionId = "resolutionId"
            case unsupportedResources = "unsupportedResources"
        }
    }

    public struct LogicalResourceId: AWSEncodableShape & AWSDecodableShape {
        /// Name of the Amazon Elastic Kubernetes Service cluster and namespace this resource belongs to.  This parameter accepts values in "eks-cluster/namespace" format.
        public let eksSourceName: String?
        /// Identifier of the resource.
        public let identifier: String
        /// The name of the CloudFormation stack this resource belongs to.
        public let logicalStackName: String?
        /// The name of the resource group that this resource belongs to.
        public let resourceGroupName: String?
        ///  The name of the Terraform S3 state file this resource belongs to.
        public let terraformSourceName: String?

        @inlinable
        public init(eksSourceName: String? = nil, identifier: String, logicalStackName: String? = nil, resourceGroupName: String? = nil, terraformSourceName: String? = nil) {
            self.eksSourceName = eksSourceName
            self.identifier = identifier
            self.logicalStackName = logicalStackName
            self.resourceGroupName = resourceGroupName
            self.terraformSourceName = terraformSourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.eksSourceName, name: "eksSourceName", parent: name, max: 255)
            try self.validate(self.eksSourceName, name: "eksSourceName", parent: name, min: 1)
            try self.validate(self.identifier, name: "identifier", parent: name, max: 255)
            try self.validate(self.identifier, name: "identifier", parent: name, min: 1)
            try self.validate(self.logicalStackName, name: "logicalStackName", parent: name, max: 255)
            try self.validate(self.logicalStackName, name: "logicalStackName", parent: name, min: 1)
            try self.validate(self.resourceGroupName, name: "resourceGroupName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.terraformSourceName, name: "terraformSourceName", parent: name, max: 255)
            try self.validate(self.terraformSourceName, name: "terraformSourceName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case eksSourceName = "eksSourceName"
            case identifier = "identifier"
            case logicalStackName = "logicalStackName"
            case resourceGroupName = "resourceGroupName"
            case terraformSourceName = "terraformSourceName"
        }
    }

    public struct PermissionModel: AWSEncodableShape & AWSDecodableShape {
        /// Defines a list of role Amazon Resource Names (ARNs) to be used in other accounts. These ARNs are used for querying purposes while importing resources and assessing your application.    These ARNs are required only when your resources are in other accounts and you have different role name in these accounts. Else, the invoker role name will be used in the other accounts.   These roles must have a trust policy with iam:AssumeRole permission to the invoker role in the primary account.
        public let crossAccountRoleArns: [String]?
        /// Existing Amazon Web Services IAM role name in the primary Amazon Web Services account that will be assumed by Resilience Hub Service Principle to obtain a read-only access to your application resources while running an assessment.  If your IAM role includes a path, you must include the path in the invokerRoleName parameter.  For example, if your IAM role's ARN is arn:aws:iam:123456789012:role/my-path/role-name, you should pass my-path/role-name.     You must have iam:passRole permission for this role while creating or updating the application.   Currently, invokerRoleName accepts only [A-Za-z0-9_+=,.@-] characters.
        public let invokerRoleName: String?
        /// Defines how Resilience Hub scans your resources. It can scan for the resources by using a pre-existing role in your Amazon Web Services account, or by using the credentials of the current IAM user.
        public let type: PermissionModelType

        @inlinable
        public init(crossAccountRoleArns: [String]? = nil, invokerRoleName: String? = nil, type: PermissionModelType) {
            self.crossAccountRoleArns = crossAccountRoleArns
            self.invokerRoleName = invokerRoleName
            self.type = type
        }

        public func validate(name: String) throws {
            try self.crossAccountRoleArns?.forEach {
                try validate($0, name: "crossAccountRoleArns[]", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):iam::[0-9]{12}:role/(([^/][!-~]+/){1,511})?[A-Za-z0-9_+=,.@-]{1,64}$")
            }
            try self.validate(self.crossAccountRoleArns, name: "crossAccountRoleArns", parent: name, max: 10)
            try self.validate(self.invokerRoleName, name: "invokerRoleName", parent: name, pattern: "^([^/]([!-~]+/){1,511})?[A-Za-z0-9_+=,.@-]{1,64}$")
        }

        private enum CodingKeys: String, CodingKey {
            case crossAccountRoleArns = "crossAccountRoleArns"
            case invokerRoleName = "invokerRoleName"
            case type = "type"
        }
    }

    public struct PhysicalResource: AWSDecodableShape {
        /// Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account. Key: "failover-regions"  Value: "[{"region":"&lt;REGION&gt;", "accounts":[{"id":"&lt;ACCOUNT_ID&gt;"}]}]"
        public let additionalInfo: [String: [String]]?
        /// The application components that belong to this resource.
        public let appComponents: [AppComponent]?
        /// Indicates if a resource is included or excluded from the assessment.
        public let excluded: Bool?
        /// Logical identifier of the resource.
        public let logicalResourceId: LogicalResourceId
        /// Name of the parent resource.
        public let parentResourceName: String?
        /// Identifier of the physical resource.
        public let physicalResourceId: PhysicalResourceId
        /// The name of the resource.
        public let resourceName: String?
        /// Type of resource.
        public let resourceType: String
        /// Type of input source.
        public let sourceType: ResourceSourceType?

        @inlinable
        public init(additionalInfo: [String: [String]]? = nil, appComponents: [AppComponent]? = nil, excluded: Bool? = nil, logicalResourceId: LogicalResourceId, parentResourceName: String? = nil, physicalResourceId: PhysicalResourceId, resourceName: String? = nil, resourceType: String, sourceType: ResourceSourceType? = nil) {
            self.additionalInfo = additionalInfo
            self.appComponents = appComponents
            self.excluded = excluded
            self.logicalResourceId = logicalResourceId
            self.parentResourceName = parentResourceName
            self.physicalResourceId = physicalResourceId
            self.resourceName = resourceName
            self.resourceType = resourceType
            self.sourceType = sourceType
        }

        private enum CodingKeys: String, CodingKey {
            case additionalInfo = "additionalInfo"
            case appComponents = "appComponents"
            case excluded = "excluded"
            case logicalResourceId = "logicalResourceId"
            case parentResourceName = "parentResourceName"
            case physicalResourceId = "physicalResourceId"
            case resourceName = "resourceName"
            case resourceType = "resourceType"
            case sourceType = "sourceType"
        }
    }

    public struct PhysicalResourceId: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon Web Services account that owns the physical resource.
        public let awsAccountId: String?
        /// The Amazon Web Services Region that the physical resource is located in.
        public let awsRegion: String?
        /// Identifier of the physical resource.
        public let identifier: String
        /// Specifies the type of physical resource identifier.  Arn  The resource identifier is an Amazon Resource Name (ARN) and it can identify the following list of resources:    AWS::ECS::Service     AWS::EFS::FileSystem     AWS::ElasticLoadBalancingV2::LoadBalancer     AWS::Lambda::Function     AWS::SNS::Topic     Native  The resource identifier is an Resilience Hub-native identifier and it can identify the following list of resources:    AWS::ApiGateway::RestApi     AWS::ApiGatewayV2::Api     AWS::AutoScaling::AutoScalingGroup     AWS::DocDB::DBCluster     AWS::DocDB::DBGlobalCluster     AWS::DocDB::DBInstance     AWS::DynamoDB::GlobalTable     AWS::DynamoDB::Table     AWS::EC2::EC2Fleet     AWS::EC2::Instance     AWS::EC2::NatGateway     AWS::EC2::Volume     AWS::ElasticLoadBalancing::LoadBalancer     AWS::RDS::DBCluster     AWS::RDS::DBInstance     AWS::RDS::GlobalCluster     AWS::Route53::RecordSet     AWS::S3::Bucket     AWS::SQS::Queue
        public let type: PhysicalIdentifierType

        @inlinable
        public init(awsAccountId: String? = nil, awsRegion: String? = nil, identifier: String, type: PhysicalIdentifierType) {
            self.awsAccountId = awsAccountId
            self.awsRegion = awsRegion
            self.identifier = identifier
            self.type = type
        }

        public func validate(name: String) throws {
            try self.validate(self.awsAccountId, name: "awsAccountId", parent: name, pattern: "^[0-9]{12}$")
            try self.validate(self.awsRegion, name: "awsRegion", parent: name, pattern: "^[a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]$")
            try self.validate(self.identifier, name: "identifier", parent: name, max: 255)
            try self.validate(self.identifier, name: "identifier", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case awsAccountId = "awsAccountId"
            case awsRegion = "awsRegion"
            case identifier = "identifier"
            case type = "type"
        }
    }

    public struct PublishAppVersionRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Name of the application version.
        public let versionName: String?

        @inlinable
        public init(appArn: String, versionName: String? = nil) {
            self.appArn = appArn
            self.versionName = versionName
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.versionName, name: "versionName", parent: name, pattern: "^\\S{1,50}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case versionName = "versionName"
        }
    }

    public struct PublishAppVersionResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String?
        /// Identifier of the application version.
        public let identifier: Int64?
        /// Name of the application version.
        public let versionName: String?

        @inlinable
        public init(appArn: String, appVersion: String? = nil, identifier: Int64? = nil, versionName: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.identifier = identifier
            self.versionName = versionName
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case identifier = "identifier"
            case versionName = "versionName"
        }
    }

    public struct PutDraftAppVersionTemplateRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// A JSON string that provides information about your application structure. To learn more about the appTemplateBody template, see the sample template provided in the Examples section. The appTemplateBody JSON string has the following structure:     resources   The list of logical resources that must be included in the Resilience Hub application. Type: Array  Don't add the resources that you want to exclude.  Each resources array item includes the following fields:     logicalResourceId   Logical identifier of the resource. Type: Object Each logicalResourceId object includes the following fields:    identifier  Identifier of the resource. Type: String    logicalStackName  The name of the CloudFormation stack this resource belongs to. Type: String    resourceGroupName  The name of the resource group this resource belongs to. Type: String    terraformSourceName  The name of the Terraform S3 state file this resource belongs to. Type: String    eksSourceName  Name of the Amazon Elastic Kubernetes Service cluster and namespace this resource belongs to.  This parameter accepts values in "eks-cluster/namespace" format.  Type: String       type   The type of resource. Type: string     name   The name of the resource. Type: String    additionalInfo  Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account. Key: "failover-regions"  Value: "[{"region":"&lt;REGION&gt;", "accounts":[{"id":"&lt;ACCOUNT_ID&gt;"}]}]"         appComponents   List of Application Components that this resource belongs to. If an Application Component is not part of the Resilience Hub application, it will be added. Type: Array Each appComponents array item includes the following fields:    name  Name of the Application Component. Type: String    type  Type of Application Component. For more information about the types of Application Component, see Grouping resources in an AppComponent. Type: String    resourceNames  The list of included resources that are assigned to the Application Component. Type: Array of strings    additionalInfo  Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account. Key: "failover-regions"  Value: "[{"region":"&lt;REGION&gt;", "accounts":[{"id":"&lt;ACCOUNT_ID&gt;"}]}]"         excludedResources   The list of logical resource identifiers to be excluded from the application. Type: Array  Don't add the resources that you want to include.  Each excludedResources array item includes the following fields:     logicalResourceIds   Logical identifier of the resource. Type: Object  You can configure only one of the following fields:    logicalStackName     resourceGroupName     terraformSourceName     eksSourceName     Each logicalResourceIds object includes the following fields:    identifier  Identifier of the resource. Type: String    logicalStackName  The name of the CloudFormation stack this resource belongs to. Type: String    resourceGroupName  The name of the resource group this resource belongs to. Type: String    terraformSourceName  The name of the Terraform S3 state file this resource belongs to. Type: String    eksSourceName  Name of the Amazon Elastic Kubernetes Service cluster and namespace this resource belongs to.  This parameter accepts values in "eks-cluster/namespace" format.  Type: String         version   Resilience Hub application version.    additionalInfo  Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account. Key: "failover-regions"  Value: "[{"region":"&lt;REGION&gt;", "accounts":[{"id":"&lt;ACCOUNT_ID&gt;"}]}]"
        public let appTemplateBody: String

        @inlinable
        public init(appArn: String, appTemplateBody: String) {
            self.appArn = appArn
            self.appTemplateBody = appTemplateBody
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appTemplateBody, name: "appTemplateBody", parent: name, max: 409600)
            try self.validate(self.appTemplateBody, name: "appTemplateBody", parent: name, pattern: "^[\\w\\s:,-\\.'\\/{}\\[\\]:\"\\\\]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appTemplateBody = "appTemplateBody"
        }
    }

    public struct PutDraftAppVersionTemplateResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String?
        /// The version of the application.
        public let appVersion: String?

        @inlinable
        public init(appArn: String? = nil, appVersion: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
        }
    }

    public struct RecommendationDisruptionCompliance: AWSDecodableShape {
        /// The expected compliance status after applying the recommended configuration change.
        public let expectedComplianceStatus: ComplianceStatus
        /// The expected Recovery Point Objective (RPO) description after applying the recommended configuration change.
        public let expectedRpoDescription: String?
        /// The expected RPO after applying the recommended configuration change.
        public let expectedRpoInSecs: Int?
        /// The expected Recovery Time Objective (RTO) description after applying the recommended configuration change.
        public let expectedRtoDescription: String?
        /// The expected RTO after applying the recommended configuration change.
        public let expectedRtoInSecs: Int?

        @inlinable
        public init(expectedComplianceStatus: ComplianceStatus, expectedRpoDescription: String? = nil, expectedRpoInSecs: Int? = nil, expectedRtoDescription: String? = nil, expectedRtoInSecs: Int? = nil) {
            self.expectedComplianceStatus = expectedComplianceStatus
            self.expectedRpoDescription = expectedRpoDescription
            self.expectedRpoInSecs = expectedRpoInSecs
            self.expectedRtoDescription = expectedRtoDescription
            self.expectedRtoInSecs = expectedRtoInSecs
        }

        private enum CodingKeys: String, CodingKey {
            case expectedComplianceStatus = "expectedComplianceStatus"
            case expectedRpoDescription = "expectedRpoDescription"
            case expectedRpoInSecs = "expectedRpoInSecs"
            case expectedRtoDescription = "expectedRtoDescription"
            case expectedRtoInSecs = "expectedRtoInSecs"
        }
    }

    public struct RecommendationItem: AWSDecodableShape {
        /// Specifies if the recommendation has already been implemented.
        public let alreadyImplemented: Bool?
        /// Indicates the previously implemented Amazon CloudWatch alarm discovered by Resilience Hub.
        public let discoveredAlarm: Alarm?
        /// Indicates if an operational recommendation item is excluded.
        public let excluded: Bool?
        /// Indicates the reason for excluding an operational recommendation.
        public let excludeReason: ExcludeRecommendationReason?
        /// Indicates the experiment created in FIS that was discovered by Resilience Hub, which matches the recommendation.
        public let latestDiscoveredExperiment: Experiment?
        /// Identifier of the resource.
        public let resourceId: String?
        /// Identifier of the target account.
        public let targetAccountId: String?
        /// The target region.
        public let targetRegion: String?

        @inlinable
        public init(alreadyImplemented: Bool? = nil, discoveredAlarm: Alarm? = nil, excluded: Bool? = nil, excludeReason: ExcludeRecommendationReason? = nil, latestDiscoveredExperiment: Experiment? = nil, resourceId: String? = nil, targetAccountId: String? = nil, targetRegion: String? = nil) {
            self.alreadyImplemented = alreadyImplemented
            self.discoveredAlarm = discoveredAlarm
            self.excluded = excluded
            self.excludeReason = excludeReason
            self.latestDiscoveredExperiment = latestDiscoveredExperiment
            self.resourceId = resourceId
            self.targetAccountId = targetAccountId
            self.targetRegion = targetRegion
        }

        private enum CodingKeys: String, CodingKey {
            case alreadyImplemented = "alreadyImplemented"
            case discoveredAlarm = "discoveredAlarm"
            case excluded = "excluded"
            case excludeReason = "excludeReason"
            case latestDiscoveredExperiment = "latestDiscoveredExperiment"
            case resourceId = "resourceId"
            case targetAccountId = "targetAccountId"
            case targetRegion = "targetRegion"
        }
    }

    public struct RecommendationTemplate: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String?
        /// Amazon Resource Name (ARN) of the assessment. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let assessmentArn: String
        /// The end time for the action.
        public let endTime: Date?
        /// Format of the recommendation template.  CfnJson  The template is CloudFormation JSON.  CfnYaml  The template is CloudFormation YAML.
        public let format: TemplateFormat
        /// Message for the recommendation template.
        public let message: String?
        /// Name for the recommendation template.
        public let name: String
        /// Indicates if replacements are needed.
        public let needsReplacements: Bool?
        /// Identifiers for the recommendations used in the recommendation template.
        public let recommendationIds: [String]?
        /// Amazon Resource Name (ARN) for the recommendation template.
        public let recommendationTemplateArn: String
        /// An array of strings that specify the recommendation template type or types.  Alarm  The template is an AlarmRecommendation template.  Sop  The template is a SopRecommendation template.  Test  The template is a TestRecommendation template.
        public let recommendationTypes: [RenderRecommendationType]
        /// The start time for the action.
        public let startTime: Date?
        /// Status of the action.
        public let status: RecommendationTemplateStatus
        /// Tags assigned to the resource. A tag is a label that you assign to an Amazon Web Services resource.
        /// Each tag consists of a key/value pair.
        public let tags: [String: String]?
        /// The file location of the template.
        public let templatesLocation: S3Location?

        @inlinable
        public init(appArn: String? = nil, assessmentArn: String, endTime: Date? = nil, format: TemplateFormat, message: String? = nil, name: String, needsReplacements: Bool? = nil, recommendationIds: [String]? = nil, recommendationTemplateArn: String, recommendationTypes: [RenderRecommendationType], startTime: Date? = nil, status: RecommendationTemplateStatus, tags: [String: String]? = nil, templatesLocation: S3Location? = nil) {
            self.appArn = appArn
            self.assessmentArn = assessmentArn
            self.endTime = endTime
            self.format = format
            self.message = message
            self.name = name
            self.needsReplacements = needsReplacements
            self.recommendationIds = recommendationIds
            self.recommendationTemplateArn = recommendationTemplateArn
            self.recommendationTypes = recommendationTypes
            self.startTime = startTime
            self.status = status
            self.tags = tags
            self.templatesLocation = templatesLocation
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case assessmentArn = "assessmentArn"
            case endTime = "endTime"
            case format = "format"
            case message = "message"
            case name = "name"
            case needsReplacements = "needsReplacements"
            case recommendationIds = "recommendationIds"
            case recommendationTemplateArn = "recommendationTemplateArn"
            case recommendationTypes = "recommendationTypes"
            case startTime = "startTime"
            case status = "status"
            case tags = "tags"
            case templatesLocation = "templatesLocation"
        }
    }

    public struct RejectGroupingRecommendationEntry: AWSEncodableShape {
        /// Indicates the identifier of the grouping recommendation.
        public let groupingRecommendationId: String
        /// Indicates the reason you had selected while rejecting a grouping recommendation.
        public let rejectionReason: GroupingRecommendationRejectionReason?

        @inlinable
        public init(groupingRecommendationId: String, rejectionReason: GroupingRecommendationRejectionReason? = nil) {
            self.groupingRecommendationId = groupingRecommendationId
            self.rejectionReason = rejectionReason
        }

        public func validate(name: String) throws {
            try self.validate(self.groupingRecommendationId, name: "groupingRecommendationId", parent: name, max: 255)
            try self.validate(self.groupingRecommendationId, name: "groupingRecommendationId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case groupingRecommendationId = "groupingRecommendationId"
            case rejectionReason = "rejectionReason"
        }
    }

    public struct RejectResourceGroupingRecommendationsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// List of resource grouping recommendations you have selected to exclude from your application.
        public let entries: [RejectGroupingRecommendationEntry]

        @inlinable
        public init(appArn: String, entries: [RejectGroupingRecommendationEntry]) {
            self.appArn = appArn
            self.entries = entries
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.entries.forEach {
                try $0.validate(name: "\(name).entries[]")
            }
            try self.validate(self.entries, name: "entries", parent: name, max: 30)
            try self.validate(self.entries, name: "entries", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case entries = "entries"
        }
    }

    public struct RejectResourceGroupingRecommendationsResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// List of resource grouping recommendations that failed to get excluded in your application.
        public let failedEntries: [FailedGroupingRecommendationEntry]

        @inlinable
        public init(appArn: String, failedEntries: [FailedGroupingRecommendationEntry]) {
            self.appArn = appArn
            self.failedEntries = failedEntries
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case failedEntries = "failedEntries"
        }
    }

    public struct RemoveDraftAppVersionResourceMappingsRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The names of the registered applications you want to remove from the resource mappings.
        public let appRegistryAppNames: [String]?
        /// The names of the Amazon Elastic Kubernetes Service clusters and namespaces you want to remove from the resource mappings.  This parameter accepts values in "eks-cluster/namespace" format.
        public let eksSourceNames: [String]?
        /// The names of the CloudFormation stacks you want to remove from the resource mappings.
        public let logicalStackNames: [String]?
        /// The names of the resource groups you want to remove from the resource mappings.
        public let resourceGroupNames: [String]?
        /// The names of the resources you want to remove from the resource mappings.
        public let resourceNames: [String]?
        /// The names of the Terraform sources you want to remove from the resource mappings.
        public let terraformSourceNames: [String]?

        @inlinable
        public init(appArn: String, appRegistryAppNames: [String]? = nil, eksSourceNames: [String]? = nil, logicalStackNames: [String]? = nil, resourceGroupNames: [String]? = nil, resourceNames: [String]? = nil, terraformSourceNames: [String]? = nil) {
            self.appArn = appArn
            self.appRegistryAppNames = appRegistryAppNames
            self.eksSourceNames = eksSourceNames
            self.logicalStackNames = logicalStackNames
            self.resourceGroupNames = resourceGroupNames
            self.resourceNames = resourceNames
            self.terraformSourceNames = terraformSourceNames
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.appRegistryAppNames?.forEach {
                try validate($0, name: "appRegistryAppNames[]", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            }
            try self.eksSourceNames?.forEach {
                try validate($0, name: "eksSourceNames[]", parent: name, max: 255)
                try validate($0, name: "eksSourceNames[]", parent: name, min: 1)
            }
            try self.logicalStackNames?.forEach {
                try validate($0, name: "logicalStackNames[]", parent: name, max: 255)
                try validate($0, name: "logicalStackNames[]", parent: name, min: 1)
            }
            try self.resourceGroupNames?.forEach {
                try validate($0, name: "resourceGroupNames[]", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            }
            try self.resourceNames?.forEach {
                try validate($0, name: "resourceNames[]", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            }
            try self.terraformSourceNames?.forEach {
                try validate($0, name: "terraformSourceNames[]", parent: name, max: 255)
                try validate($0, name: "terraformSourceNames[]", parent: name, min: 1)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appRegistryAppNames = "appRegistryAppNames"
            case eksSourceNames = "eksSourceNames"
            case logicalStackNames = "logicalStackNames"
            case resourceGroupNames = "resourceGroupNames"
            case resourceNames = "resourceNames"
            case terraformSourceNames = "terraformSourceNames"
        }
    }

    public struct RemoveDraftAppVersionResourceMappingsResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String?
        /// The version of the application.
        public let appVersion: String?

        @inlinable
        public init(appArn: String? = nil, appVersion: String? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
        }
    }

    public struct ResiliencyPolicy: AWSDecodableShape {
        /// Date and time when the resiliency policy was created.
        public let creationTime: Date?
        /// Specifies a high-level geographical location constraint for where your resilience policy data can be stored.
        public let dataLocationConstraint: DataLocationConstraint?
        /// Specifies the estimated cost tier of the resiliency policy.
        public let estimatedCostTier: EstimatedCostTier?
        /// The resiliency policy.
        public let policy: [DisruptionType: FailurePolicy]?
        /// Amazon Resource Name (ARN) of the resiliency policy. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:resiliency-policy/policy-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let policyArn: String?
        /// Description of the resiliency policy.
        public let policyDescription: String?
        /// The name of the policy
        public let policyName: String?
        /// Tags assigned to the resource. A tag is a label that you assign to an Amazon Web Services resource.
        /// Each tag consists of a key/value pair.
        public let tags: [String: String]?
        /// The tier for this resiliency policy, ranging from the highest severity (MissionCritical) to lowest (NonCritical).
        public let tier: ResiliencyPolicyTier?

        @inlinable
        public init(creationTime: Date? = nil, dataLocationConstraint: DataLocationConstraint? = nil, estimatedCostTier: EstimatedCostTier? = nil, policy: [DisruptionType: FailurePolicy]? = nil, policyArn: String? = nil, policyDescription: String? = nil, policyName: String? = nil, tags: [String: String]? = nil, tier: ResiliencyPolicyTier? = nil) {
            self.creationTime = creationTime
            self.dataLocationConstraint = dataLocationConstraint
            self.estimatedCostTier = estimatedCostTier
            self.policy = policy
            self.policyArn = policyArn
            self.policyDescription = policyDescription
            self.policyName = policyName
            self.tags = tags
            self.tier = tier
        }

        private enum CodingKeys: String, CodingKey {
            case creationTime = "creationTime"
            case dataLocationConstraint = "dataLocationConstraint"
            case estimatedCostTier = "estimatedCostTier"
            case policy = "policy"
            case policyArn = "policyArn"
            case policyDescription = "policyDescription"
            case policyName = "policyName"
            case tags = "tags"
            case tier = "tier"
        }
    }

    public struct ResiliencyScore: AWSDecodableShape {
        /// The score generated by Resilience Hub for the scoring component after running an assessment. For example, if the score is 25 points, it indicates the overall score of your application generated by Resilience Hub after running an assessment.
        public let componentScore: [ResiliencyScoreType: ScoringComponentResiliencyScore]?
        /// The disruption score for a valid key.
        public let disruptionScore: [DisruptionType: Double]
        /// The outage score for a valid key.
        public let score: Double

        @inlinable
        public init(componentScore: [ResiliencyScoreType: ScoringComponentResiliencyScore]? = nil, disruptionScore: [DisruptionType: Double], score: Double) {
            self.componentScore = componentScore
            self.disruptionScore = disruptionScore
            self.score = score
        }

        private enum CodingKeys: String, CodingKey {
            case componentScore = "componentScore"
            case disruptionScore = "disruptionScore"
            case score = "score"
        }
    }

    public struct ResolveAppVersionResourcesRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String

        @inlinable
        public init(appArn: String, appVersion: String) {
            self.appArn = appArn
            self.appVersion = appVersion
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
        }
    }

    public struct ResolveAppVersionResourcesResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String
        /// The identifier for a specific resolution.
        public let resolutionId: String
        /// Status of the action.
        public let status: ResourceResolutionStatusType

        @inlinable
        public init(appArn: String, appVersion: String, resolutionId: String, status: ResourceResolutionStatusType) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.resolutionId = resolutionId
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case resolutionId = "resolutionId"
            case status = "status"
        }
    }

    public struct ResourceDrift: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the application whose resources have drifted. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app-assessment/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String?
        /// Version of the application whose resources have drifted.
        public let appVersion: String?
        /// Indicates if the resource was added or removed.
        public let diffType: DifferenceType?
        /// Reference identifier of the resource drift.
        public let referenceId: String?
        /// Identifier of the drifted resource.
        public let resourceIdentifier: ResourceIdentifier?

        @inlinable
        public init(appArn: String? = nil, appVersion: String? = nil, diffType: DifferenceType? = nil, referenceId: String? = nil, resourceIdentifier: ResourceIdentifier? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.diffType = diffType
            self.referenceId = referenceId
            self.resourceIdentifier = resourceIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case diffType = "diffType"
            case referenceId = "referenceId"
            case resourceIdentifier = "resourceIdentifier"
        }
    }

    public struct ResourceError: AWSDecodableShape {
        /// Identifier of the logical resource.
        public let logicalResourceId: String?
        /// Identifier of the physical resource.
        public let physicalResourceId: String?
        ///  This is the error message.
        public let reason: String?

        @inlinable
        public init(logicalResourceId: String? = nil, physicalResourceId: String? = nil, reason: String? = nil) {
            self.logicalResourceId = logicalResourceId
            self.physicalResourceId = physicalResourceId
            self.reason = reason
        }

        private enum CodingKeys: String, CodingKey {
            case logicalResourceId = "logicalResourceId"
            case physicalResourceId = "physicalResourceId"
            case reason = "reason"
        }
    }

    public struct ResourceErrorsDetails: AWSDecodableShape {
        ///  This indicates if there are more errors not listed in the resourceErrors list.
        public let hasMoreErrors: Bool?
        ///  A list of errors retrieving an application's resources.
        public let resourceErrors: [ResourceError]?

        @inlinable
        public init(hasMoreErrors: Bool? = nil, resourceErrors: [ResourceError]? = nil) {
            self.hasMoreErrors = hasMoreErrors
            self.resourceErrors = resourceErrors
        }

        private enum CodingKeys: String, CodingKey {
            case hasMoreErrors = "hasMoreErrors"
            case resourceErrors = "resourceErrors"
        }
    }

    public struct ResourceIdentifier: AWSDecodableShape {
        /// Logical identifier of the drifted resource.
        public let logicalResourceId: LogicalResourceId?
        /// Type of the drifted resource.
        public let resourceType: String?

        @inlinable
        public init(logicalResourceId: LogicalResourceId? = nil, resourceType: String? = nil) {
            self.logicalResourceId = logicalResourceId
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case logicalResourceId = "logicalResourceId"
            case resourceType = "resourceType"
        }
    }

    public struct ResourceMapping: AWSEncodableShape & AWSDecodableShape {
        /// Name of the application this resource is mapped to when the mappingType is AppRegistryApp.
        public let appRegistryAppName: String?
        /// Name of the Amazon Elastic Kubernetes Service cluster and namespace that this resource is mapped to when the mappingType is EKS.  This parameter accepts values in "eks-cluster/namespace" format.
        public let eksSourceName: String?
        /// Name of the CloudFormation stack this resource is mapped to when the mappingType is CfnStack.
        public let logicalStackName: String?
        /// Specifies the type of resource mapping.
        public let mappingType: ResourceMappingType
        /// Identifier of the physical resource.
        public let physicalResourceId: PhysicalResourceId
        /// Name of the Resource Groups that this resource is mapped to when the mappingType is ResourceGroup.
        public let resourceGroupName: String?
        /// Name of the resource that this resource is mapped to when the mappingType is Resource.
        public let resourceName: String?
        /// Name of the Terraform source that this resource is mapped to when the mappingType is Terraform.
        public let terraformSourceName: String?

        @inlinable
        public init(appRegistryAppName: String? = nil, eksSourceName: String? = nil, logicalStackName: String? = nil, mappingType: ResourceMappingType, physicalResourceId: PhysicalResourceId, resourceGroupName: String? = nil, resourceName: String? = nil, terraformSourceName: String? = nil) {
            self.appRegistryAppName = appRegistryAppName
            self.eksSourceName = eksSourceName
            self.logicalStackName = logicalStackName
            self.mappingType = mappingType
            self.physicalResourceId = physicalResourceId
            self.resourceGroupName = resourceGroupName
            self.resourceName = resourceName
            self.terraformSourceName = terraformSourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.appRegistryAppName, name: "appRegistryAppName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.eksSourceName, name: "eksSourceName", parent: name, max: 255)
            try self.validate(self.eksSourceName, name: "eksSourceName", parent: name, min: 1)
            try self.validate(self.logicalStackName, name: "logicalStackName", parent: name, max: 255)
            try self.validate(self.logicalStackName, name: "logicalStackName", parent: name, min: 1)
            try self.physicalResourceId.validate(name: "\(name).physicalResourceId")
            try self.validate(self.resourceGroupName, name: "resourceGroupName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.terraformSourceName, name: "terraformSourceName", parent: name, max: 255)
            try self.validate(self.terraformSourceName, name: "terraformSourceName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appRegistryAppName = "appRegistryAppName"
            case eksSourceName = "eksSourceName"
            case logicalStackName = "logicalStackName"
            case mappingType = "mappingType"
            case physicalResourceId = "physicalResourceId"
            case resourceGroupName = "resourceGroupName"
            case resourceName = "resourceName"
            case terraformSourceName = "terraformSourceName"
        }
    }

    public struct ResourceNotFoundException: AWSErrorShape {
        public let message: String?
        /// The identifier of the resource that the exception applies to.
        public let resourceId: String?
        /// The type of the resource that the exception applies to.
        public let resourceType: String?

        @inlinable
        public init(message: String? = nil, resourceId: String? = nil, resourceType: String? = nil) {
            self.message = message
            self.resourceId = resourceId
            self.resourceType = resourceType
        }

        private enum CodingKeys: String, CodingKey {
            case message = "message"
            case resourceId = "resourceId"
            case resourceType = "resourceType"
        }
    }

    public struct S3Location: AWSDecodableShape {
        /// The name of the Amazon S3 bucket.
        public let bucket: String?
        /// The prefix for the Amazon S3 bucket.
        public let prefix: String?

        @inlinable
        public init(bucket: String? = nil, prefix: String? = nil) {
            self.bucket = bucket
            self.prefix = prefix
        }

        private enum CodingKeys: String, CodingKey {
            case bucket = "bucket"
            case prefix = "prefix"
        }
    }

    public struct ScoringComponentResiliencyScore: AWSDecodableShape {
        /// Number of recommendations that were excluded from the assessment. For example, if the excludedCount for Alarms coverage scoring component is 7, it indicates that 7 Amazon CloudWatch alarms are excluded from the assessment.
        public let excludedCount: Int64?
        /// Number of recommendations that must be implemented to obtain the maximum possible score for the scoring component. For SOPs, alarms, and tests, these are the number of recommendations that must be implemented. For compliance, these are the number of Application Components that have breached the resiliency policy. For example, if the outstandingCount for Alarms coverage scoring component is 5, it indicates that 5 Amazon CloudWatch alarms need to be implemented to achieve the maximum possible score.
        public let outstandingCount: Int64?
        /// Maximum possible score that can be obtained for the scoring component.  For example, if the possibleScore is 20 points, it indicates the maximum possible score you can achieve for the scoring component when you run a new assessment after implementing all the Resilience Hub recommendations.
        public let possibleScore: Double?
        /// Resiliency score points given for the scoring component. The score is always less than or equal to the possibleScore.
        public let score: Double?

        @inlinable
        public init(excludedCount: Int64? = nil, outstandingCount: Int64? = nil, possibleScore: Double? = nil, score: Double? = nil) {
            self.excludedCount = excludedCount
            self.outstandingCount = outstandingCount
            self.possibleScore = possibleScore
            self.score = score
        }

        private enum CodingKeys: String, CodingKey {
            case excludedCount = "excludedCount"
            case outstandingCount = "outstandingCount"
            case possibleScore = "possibleScore"
            case score = "score"
        }
    }

    public struct SopRecommendation: AWSDecodableShape {
        /// Name of the Application Component.
        public let appComponentName: String?
        /// Description of the SOP recommendation.
        public let description: String?
        /// The recommendation items.
        public let items: [RecommendationItem]?
        /// Name of the SOP recommendation.
        public let name: String?
        /// Prerequisite for the SOP recommendation.
        public let prerequisite: String?
        /// Identifier for the SOP recommendation.
        public let recommendationId: String
        /// Status of the recommended standard operating procedure.
        public let recommendationStatus: RecommendationStatus?
        /// Reference identifier for the SOP recommendation.
        public let referenceId: String
        /// The service type.
        public let serviceType: SopServiceType

        @inlinable
        public init(appComponentName: String? = nil, description: String? = nil, items: [RecommendationItem]? = nil, name: String? = nil, prerequisite: String? = nil, recommendationId: String, recommendationStatus: RecommendationStatus? = nil, referenceId: String, serviceType: SopServiceType) {
            self.appComponentName = appComponentName
            self.description = description
            self.items = items
            self.name = name
            self.prerequisite = prerequisite
            self.recommendationId = recommendationId
            self.recommendationStatus = recommendationStatus
            self.referenceId = referenceId
            self.serviceType = serviceType
        }

        private enum CodingKeys: String, CodingKey {
            case appComponentName = "appComponentName"
            case description = "description"
            case items = "items"
            case name = "name"
            case prerequisite = "prerequisite"
            case recommendationId = "recommendationId"
            case recommendationStatus = "recommendationStatus"
            case referenceId = "referenceId"
            case serviceType = "serviceType"
        }
    }

    public struct Sort: AWSEncodableShape {
        /// Indicates the name or identifier of the field or attribute that should be used as the basis for sorting the metrics.
        public let ascending: Bool?
        /// Indicates the order in which you want to sort the metrics. By default, the list is sorted in ascending order. To sort the list in descending order, set this field to False.
        public let field: String

        @inlinable
        public init(ascending: Bool? = nil, field: String) {
            self.ascending = ascending
            self.field = field
        }

        public func validate(name: String) throws {
            try self.validate(self.field, name: "field", parent: name, max: 255)
            try self.validate(self.field, name: "field", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case ascending = "ascending"
            case field = "field"
        }
    }

    public struct StartAppAssessmentRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// The version of the application.
        public let appVersion: String
        /// The name for the assessment.
        public let assessmentName: String
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?
        /// Tags assigned to the resource. A tag is a label that you assign to an Amazon Web Services resource.
        /// Each tag consists of a key/value pair.
        public let tags: [String: String]?

        @inlinable
        public init(appArn: String, appVersion: String, assessmentName: String, clientToken: String? = StartAppAssessmentRequest.idempotencyToken(), tags: [String: String]? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.assessmentName = assessmentName
            self.clientToken = clientToken
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.appVersion, name: "appVersion", parent: name, pattern: "^\\S{1,50}$")
            try self.validate(self.assessmentName, name: "assessmentName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^[^\\x00-\\x1f\\x22]+$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^[^\\x00-\\x1f\\x22]*$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case assessmentName = "assessmentName"
            case clientToken = "clientToken"
            case tags = "tags"
        }
    }

    public struct StartAppAssessmentResponse: AWSDecodableShape {
        /// The assessment created.
        public let assessment: AppAssessment

        @inlinable
        public init(assessment: AppAssessment) {
            self.assessment = assessment
        }

        private enum CodingKeys: String, CodingKey {
            case assessment = "assessment"
        }
    }

    public struct StartMetricsExportRequest: AWSEncodableShape {
        /// (Optional) Specifies the name of the Amazon Simple Storage Service bucket where the exported metrics will be stored.
        public let bucketName: String?
        /// Used for an idempotency token. A client token is a unique, case-sensitive string of up to 64 ASCII characters.
        /// You should not reuse the same client token for other API requests.
        public let clientToken: String?

        @inlinable
        public init(bucketName: String? = nil, clientToken: String? = StartMetricsExportRequest.idempotencyToken()) {
            self.bucketName = bucketName
            self.clientToken = clientToken
        }

        public func validate(name: String) throws {
            try self.validate(self.bucketName, name: "bucketName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.clientToken, name: "clientToken", parent: name, max: 63)
            try self.validate(self.clientToken, name: "clientToken", parent: name, min: 1)
            try self.validate(self.clientToken, name: "clientToken", parent: name, pattern: "^[A-Za-z0-9_.-]{0,63}$")
        }

        private enum CodingKeys: String, CodingKey {
            case bucketName = "bucketName"
            case clientToken = "clientToken"
        }
    }

    public struct StartMetricsExportResponse: AWSDecodableShape {
        /// Identifier of the metrics export task.
        public let metricsExportId: String
        /// Indicates the status of the metrics export task.
        public let status: MetricsExportStatusType

        @inlinable
        public init(metricsExportId: String, status: MetricsExportStatusType) {
            self.metricsExportId = metricsExportId
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case metricsExportId = "metricsExportId"
            case status = "status"
        }
    }

    public struct StartResourceGroupingRecommendationTaskRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String

        @inlinable
        public init(appArn: String) {
            self.appArn = appArn
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
        }
    }

    public struct StartResourceGroupingRecommendationTaskResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Error that occurred while executing a grouping recommendation task.
        public let errorMessage: String?
        /// Identifier of the grouping recommendation task.
        public let groupingId: String
        /// Status of the action.
        public let status: ResourcesGroupingRecGenStatusType

        @inlinable
        public init(appArn: String, errorMessage: String? = nil, groupingId: String, status: ResourcesGroupingRecGenStatusType) {
            self.appArn = appArn
            self.errorMessage = errorMessage
            self.groupingId = groupingId
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case errorMessage = "errorMessage"
            case groupingId = "groupingId"
            case status = "status"
        }
    }

    public struct TagResourceRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the resource.
        public let resourceArn: String
        /// The tags to assign to the resource. Each tag consists of a key/value pair.
        public let tags: [String: String]

        @inlinable
        public init(resourceArn: String, tags: [String: String]) {
            self.resourceArn = resourceArn
            self.tags = tags
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            var container = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.resourceArn, key: "resourceArn")
            try container.encode(self.tags, forKey: .tags)
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.tags.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^[^\\x00-\\x1f\\x22]+$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^[^\\x00-\\x1f\\x22]*$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.tags, name: "tags", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "tags"
        }
    }

    public struct TagResourceResponse: AWSDecodableShape {
        public init() {}
    }

    public struct TerraformSource: AWSEncodableShape & AWSDecodableShape {
        ///  The URL of the Terraform s3 state file you need to import.
        public let s3StateFileUrl: String

        @inlinable
        public init(s3StateFileUrl: String) {
            self.s3StateFileUrl = s3StateFileUrl
        }

        public func validate(name: String) throws {
            try self.validate(self.s3StateFileUrl, name: "s3StateFileUrl", parent: name, max: 2000)
            try self.validate(self.s3StateFileUrl, name: "s3StateFileUrl", parent: name, pattern: "^((https://([^/]+)\\.s3((-|\\.)[^/]+)?\\.amazonaws\\.com(.cn)?)|(s3://([^/]+)))/\\S{1,2000}$")
        }

        private enum CodingKeys: String, CodingKey {
            case s3StateFileUrl = "s3StateFileUrl"
        }
    }

    public struct TestRecommendation: AWSDecodableShape {
        /// Indicates the identifier of the AppComponent.
        public let appComponentId: String?
        /// Name of the Application Component.
        public let appComponentName: String?
        ///  A list of recommended alarms that are used in the test and must be exported before or with the test.
        public let dependsOnAlarms: [String]?
        /// Description for the test recommendation.
        public let description: String?
        /// Intent of the test recommendation.
        public let intent: String?
        /// The test recommendation items.
        public let items: [RecommendationItem]?
        /// Name of the test recommendation.
        public let name: String?
        /// Prerequisite of the test recommendation.
        public let prerequisite: String?
        /// Identifier for the test recommendation.
        public let recommendationId: String?
        /// Status of the recommended test.
        public let recommendationStatus: RecommendationStatus?
        /// Reference identifier for the test recommendation.
        public let referenceId: String
        /// Level of risk for this test recommendation.
        public let risk: TestRisk?
        /// Type of test recommendation.
        public let type: TestType?

        @inlinable
        public init(appComponentId: String? = nil, appComponentName: String? = nil, dependsOnAlarms: [String]? = nil, description: String? = nil, intent: String? = nil, items: [RecommendationItem]? = nil, name: String? = nil, prerequisite: String? = nil, recommendationId: String? = nil, recommendationStatus: RecommendationStatus? = nil, referenceId: String, risk: TestRisk? = nil, type: TestType? = nil) {
            self.appComponentId = appComponentId
            self.appComponentName = appComponentName
            self.dependsOnAlarms = dependsOnAlarms
            self.description = description
            self.intent = intent
            self.items = items
            self.name = name
            self.prerequisite = prerequisite
            self.recommendationId = recommendationId
            self.recommendationStatus = recommendationStatus
            self.referenceId = referenceId
            self.risk = risk
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case appComponentId = "appComponentId"
            case appComponentName = "appComponentName"
            case dependsOnAlarms = "dependsOnAlarms"
            case description = "description"
            case intent = "intent"
            case items = "items"
            case name = "name"
            case prerequisite = "prerequisite"
            case recommendationId = "recommendationId"
            case recommendationStatus = "recommendationStatus"
            case referenceId = "referenceId"
            case risk = "risk"
            case type = "type"
        }
    }

    public struct ThrottlingException: AWSErrorShape {
        public let message: String?
        /// The number of seconds to wait before retrying the operation.
        public let retryAfterSeconds: Int?

        @inlinable
        public init(message: String? = nil, retryAfterSeconds: Int? = nil) {
            self.message = message
            self.retryAfterSeconds = retryAfterSeconds
        }

        private enum CodingKeys: String, CodingKey {
            case message = "message"
            case retryAfterSeconds = "retryAfterSeconds"
        }
    }

    public struct UnsupportedResource: AWSDecodableShape {
        /// Logical resource identifier for the unsupported resource.
        public let logicalResourceId: LogicalResourceId
        /// Physical resource identifier for the unsupported resource.
        public let physicalResourceId: PhysicalResourceId
        /// The type of resource.
        public let resourceType: String
        /// The status of the unsupported resource.
        public let unsupportedResourceStatus: String?

        @inlinable
        public init(logicalResourceId: LogicalResourceId, physicalResourceId: PhysicalResourceId, resourceType: String, unsupportedResourceStatus: String? = nil) {
            self.logicalResourceId = logicalResourceId
            self.physicalResourceId = physicalResourceId
            self.resourceType = resourceType
            self.unsupportedResourceStatus = unsupportedResourceStatus
        }

        private enum CodingKeys: String, CodingKey {
            case logicalResourceId = "logicalResourceId"
            case physicalResourceId = "physicalResourceId"
            case resourceType = "resourceType"
            case unsupportedResourceStatus = "unsupportedResourceStatus"
        }
    }

    public struct UntagResourceRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the resource.
        public let resourceArn: String
        /// The keys of the tags you want to remove.
        public let tagKeys: [String]

        @inlinable
        public init(resourceArn: String, tagKeys: [String]) {
            self.resourceArn = resourceArn
            self.tagKeys = tagKeys
        }

        public func encode(to encoder: Encoder) throws {
            let request = encoder.userInfo[.awsRequest]! as! RequestEncodingContainer
            _ = encoder.container(keyedBy: CodingKeys.self)
            request.encodePath(self.resourceArn, key: "resourceArn")
            request.encodeQuery(self.tagKeys, key: "tagKeys")
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.tagKeys.forEach {
                try validate($0, name: "tagKeys[]", parent: name, max: 128)
                try validate($0, name: "tagKeys[]", parent: name, min: 1)
                try validate($0, name: "tagKeys[]", parent: name, pattern: "^[^\\x00-\\x1f\\x22]+$")
            }
            try self.validate(self.tagKeys, name: "tagKeys", parent: name, max: 50)
            try self.validate(self.tagKeys, name: "tagKeys", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct UntagResourceResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateAppRequest: AWSEncodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        ///  Assessment execution schedule with 'Daily' or 'Disabled' values.
        public let assessmentSchedule: AppAssessmentScheduleType?
        /// Specifies if the resiliency policy ARN should be cleared.
        public let clearResiliencyPolicyArn: Bool?
        /// The optional description for an app.
        public let description: String?
        /// The list of events you would like to subscribe and get notification for. Currently, Resilience Hub supports notifications only for Drift detected and Scheduled assessment failure events.
        public let eventSubscriptions: [EventSubscription]?
        /// Defines the roles and credentials that Resilience Hub would use while creating an application, importing its resources, and running an assessment.
        public let permissionModel: PermissionModel?
        /// Amazon Resource Name (ARN) of the resiliency policy. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:resiliency-policy/policy-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let policyArn: String?

        @inlinable
        public init(appArn: String, assessmentSchedule: AppAssessmentScheduleType? = nil, clearResiliencyPolicyArn: Bool? = nil, description: String? = nil, eventSubscriptions: [EventSubscription]? = nil, permissionModel: PermissionModel? = nil, policyArn: String? = nil) {
            self.appArn = appArn
            self.assessmentSchedule = assessmentSchedule
            self.clearResiliencyPolicyArn = clearResiliencyPolicyArn
            self.description = description
            self.eventSubscriptions = eventSubscriptions
            self.permissionModel = permissionModel
            self.policyArn = policyArn
        }

        public func validate(name: String) throws {
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.description, name: "description", parent: name, max: 500)
            try self.eventSubscriptions?.forEach {
                try $0.validate(name: "\(name).eventSubscriptions[]")
            }
            try self.validate(self.eventSubscriptions, name: "eventSubscriptions", parent: name, max: 10)
            try self.permissionModel?.validate(name: "\(name).permissionModel")
            try self.validate(self.policyArn, name: "policyArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case assessmentSchedule = "assessmentSchedule"
            case clearResiliencyPolicyArn = "clearResiliencyPolicyArn"
            case description = "description"
            case eventSubscriptions = "eventSubscriptions"
            case permissionModel = "permissionModel"
            case policyArn = "policyArn"
        }
    }

    public struct UpdateAppResponse: AWSDecodableShape {
        /// The specified application, returned as an object with details including compliance status, creation time, description, resiliency score, and more.
        public let app: App

        @inlinable
        public init(app: App) {
            self.app = app
        }

        private enum CodingKeys: String, CodingKey {
            case app = "app"
        }
    }

    public struct UpdateAppVersionAppComponentRequest: AWSEncodableShape {
        /// Currently, there is no supported additional information for Application Components.
        public let additionalInfo: [String: [String]]?
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Identifier of the Application Component.
        public let id: String
        /// Name of the Application Component.
        public let name: String?
        /// Type of Application Component. For more information about the types of Application Component, see Grouping resources in an AppComponent.
        public let type: String?

        @inlinable
        public init(additionalInfo: [String: [String]]? = nil, appArn: String, id: String, name: String? = nil, type: String? = nil) {
            self.additionalInfo = additionalInfo
            self.appArn = appArn
            self.id = id
            self.name = name
            self.type = type
        }

        public func validate(name: String) throws {
            try self.additionalInfo?.forEach {
                try validate($0.key, name: "additionalInfo.key", parent: name, pattern: "^\\S{1,128}$")
                try validate($0.value, name: "additionalInfo[\"\($0.key)\"]", parent: name, max: 10)
                try validate($0.value, name: "additionalInfo[\"\($0.key)\"]", parent: name, min: 1)
            }
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.id, name: "id", parent: name, max: 255)
            try self.validate(self.id, name: "id", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 255)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.type, name: "type", parent: name, max: 255)
            try self.validate(self.type, name: "type", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case additionalInfo = "additionalInfo"
            case appArn = "appArn"
            case id = "id"
            case name = "name"
            case type = "type"
        }
    }

    public struct UpdateAppVersionAppComponentResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// List of Application Components that belong to this resource.
        public let appComponent: AppComponent?
        /// Resilience Hub application version.
        public let appVersion: String

        @inlinable
        public init(appArn: String, appComponent: AppComponent? = nil, appVersion: String) {
            self.appArn = appArn
            self.appComponent = appComponent
            self.appVersion = appVersion
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appComponent = "appComponent"
            case appVersion = "appVersion"
        }
    }

    public struct UpdateAppVersionRequest: AWSEncodableShape {
        /// Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account. Key: "failover-regions"  Value: "[{"region":"&lt;REGION&gt;", "accounts":[{"id":"&lt;ACCOUNT_ID&gt;"}]}]"
        public let additionalInfo: [String: [String]]?
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String

        @inlinable
        public init(additionalInfo: [String: [String]]? = nil, appArn: String) {
            self.additionalInfo = additionalInfo
            self.appArn = appArn
        }

        public func validate(name: String) throws {
            try self.additionalInfo?.forEach {
                try validate($0.key, name: "additionalInfo.key", parent: name, pattern: "^\\S{1,128}$")
                try validate($0.value, name: "additionalInfo[\"\($0.key)\"]", parent: name, max: 10)
                try validate($0.value, name: "additionalInfo[\"\($0.key)\"]", parent: name, min: 1)
            }
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
        }

        private enum CodingKeys: String, CodingKey {
            case additionalInfo = "additionalInfo"
            case appArn = "appArn"
        }
    }

    public struct UpdateAppVersionResourceRequest: AWSEncodableShape {
        /// Currently, there is no supported additional information for resources.
        public let additionalInfo: [String: [String]]?
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// List of Application Components that this resource belongs to. If an Application Component is not part of the Resilience Hub application, it will be added.
        public let appComponents: [String]?
        /// Amazon Web Services account that owns the physical resource.
        public let awsAccountId: String?
        /// Amazon Web Services region that owns the physical resource.
        public let awsRegion: String?
        /// Indicates if a resource is excluded from an Resilience Hub application.  You can exclude only imported resources from an Resilience Hub application.
        public let excluded: Bool?
        /// Logical identifier of the resource.
        public let logicalResourceId: LogicalResourceId?
        /// Physical identifier of the resource.
        public let physicalResourceId: String?
        /// Name of the resource.
        public let resourceName: String?
        /// Type of resource.
        public let resourceType: String?

        @inlinable
        public init(additionalInfo: [String: [String]]? = nil, appArn: String, appComponents: [String]? = nil, awsAccountId: String? = nil, awsRegion: String? = nil, excluded: Bool? = nil, logicalResourceId: LogicalResourceId? = nil, physicalResourceId: String? = nil, resourceName: String? = nil, resourceType: String? = nil) {
            self.additionalInfo = additionalInfo
            self.appArn = appArn
            self.appComponents = appComponents
            self.awsAccountId = awsAccountId
            self.awsRegion = awsRegion
            self.excluded = excluded
            self.logicalResourceId = logicalResourceId
            self.physicalResourceId = physicalResourceId
            self.resourceName = resourceName
            self.resourceType = resourceType
        }

        public func validate(name: String) throws {
            try self.additionalInfo?.forEach {
                try validate($0.key, name: "additionalInfo.key", parent: name, pattern: "^\\S{1,128}$")
                try validate($0.value, name: "additionalInfo[\"\($0.key)\"]", parent: name, max: 10)
                try validate($0.value, name: "additionalInfo[\"\($0.key)\"]", parent: name, min: 1)
            }
            try self.validate(self.appArn, name: "appArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.appComponents?.forEach {
                try validate($0, name: "appComponents[]", parent: name, max: 255)
                try validate($0, name: "appComponents[]", parent: name, min: 1)
            }
            try self.validate(self.awsAccountId, name: "awsAccountId", parent: name, pattern: "^[0-9]{12}$")
            try self.validate(self.awsRegion, name: "awsRegion", parent: name, pattern: "^[a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]$")
            try self.logicalResourceId?.validate(name: "\(name).logicalResourceId")
            try self.validate(self.physicalResourceId, name: "physicalResourceId", parent: name, max: 2048)
            try self.validate(self.physicalResourceId, name: "physicalResourceId", parent: name, min: 1)
            try self.validate(self.resourceName, name: "resourceName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
            try self.validate(self.resourceType, name: "resourceType", parent: name, max: 255)
            try self.validate(self.resourceType, name: "resourceType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case additionalInfo = "additionalInfo"
            case appArn = "appArn"
            case appComponents = "appComponents"
            case awsAccountId = "awsAccountId"
            case awsRegion = "awsRegion"
            case excluded = "excluded"
            case logicalResourceId = "logicalResourceId"
            case physicalResourceId = "physicalResourceId"
            case resourceName = "resourceName"
            case resourceType = "resourceType"
        }
    }

    public struct UpdateAppVersionResourceResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Resilience Hub application version.
        public let appVersion: String
        /// Defines a physical resource. A physical resource is a resource that exists in your account. It can be identified using an Amazon Resource Name (ARN) or a Resilience Hub-native identifier.
        public let physicalResource: PhysicalResource?

        @inlinable
        public init(appArn: String, appVersion: String, physicalResource: PhysicalResource? = nil) {
            self.appArn = appArn
            self.appVersion = appVersion
            self.physicalResource = physicalResource
        }

        private enum CodingKeys: String, CodingKey {
            case appArn = "appArn"
            case appVersion = "appVersion"
            case physicalResource = "physicalResource"
        }
    }

    public struct UpdateAppVersionResponse: AWSDecodableShape {
        /// Additional configuration parameters for an Resilience Hub application. If you want to implement additionalInfo through the Resilience Hub console rather than using an API call, see Configure the application configuration parameters.  Currently, this parameter supports only failover region and account.
        public let additionalInfo: [String: [String]]?
        /// Amazon Resource Name (ARN) of the Resilience Hub application. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:app/app-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let appArn: String
        /// Resilience Hub application version.
        public let appVersion: String

        @inlinable
        public init(additionalInfo: [String: [String]]? = nil, appArn: String, appVersion: String) {
            self.additionalInfo = additionalInfo
            self.appArn = appArn
            self.appVersion = appVersion
        }

        private enum CodingKeys: String, CodingKey {
            case additionalInfo = "additionalInfo"
            case appArn = "appArn"
            case appVersion = "appVersion"
        }
    }

    public struct UpdateRecommendationStatusItem: AWSEncodableShape & AWSDecodableShape {
        /// Resource identifier of the operational recommendation item.
        public let resourceId: String?
        /// Identifier of the target Amazon Web Services account.
        public let targetAccountId: String?
        /// Identifier of the target Amazon Web Services Region.
        public let targetRegion: String?

        @inlinable
        public init(resourceId: String? = nil, targetAccountId: String? = nil, targetRegion: String? = nil) {
            self.resourceId = resourceId
            self.targetAccountId = targetAccountId
            self.targetRegion = targetRegion
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceId, name: "resourceId", parent: name, max: 500)
            try self.validate(self.resourceId, name: "resourceId", parent: name, min: 1)
            try self.validate(self.targetAccountId, name: "targetAccountId", parent: name, pattern: "^[0-9]{12}$")
            try self.validate(self.targetRegion, name: "targetRegion", parent: name, pattern: "^[a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]$")
        }

        private enum CodingKeys: String, CodingKey {
            case resourceId = "resourceId"
            case targetAccountId = "targetAccountId"
            case targetRegion = "targetRegion"
        }
    }

    public struct UpdateRecommendationStatusRequestEntry: AWSEncodableShape {
        /// Indicates the identifier of the AppComponent.
        public let appComponentId: String?
        /// An identifier for an entry in this batch that is used to communicate the result.  The entryIds of a batch request need to be unique within a request.
        public let entryId: String
        /// Indicates if the operational recommendation needs to be excluded. If set to True, the operational recommendation will be excluded.
        public let excluded: Bool
        /// Indicates the reason for excluding an operational recommendation.
        public let excludeReason: ExcludeRecommendationReason?
        /// The operational recommendation item.
        public let item: UpdateRecommendationStatusItem?
        /// Reference identifier of the operational recommendation item.
        public let referenceId: String

        @inlinable
        public init(appComponentId: String? = nil, entryId: String, excluded: Bool, excludeReason: ExcludeRecommendationReason? = nil, item: UpdateRecommendationStatusItem? = nil, referenceId: String) {
            self.appComponentId = appComponentId
            self.entryId = entryId
            self.excluded = excluded
            self.excludeReason = excludeReason
            self.item = item
            self.referenceId = referenceId
        }

        public func validate(name: String) throws {
            try self.validate(self.appComponentId, name: "appComponentId", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{0,254}$")
            try self.validate(self.entryId, name: "entryId", parent: name, max: 255)
            try self.validate(self.entryId, name: "entryId", parent: name, min: 1)
            try self.item?.validate(name: "\(name).item")
            try self.validate(self.referenceId, name: "referenceId", parent: name, max: 500)
            try self.validate(self.referenceId, name: "referenceId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case appComponentId = "appComponentId"
            case entryId = "entryId"
            case excluded = "excluded"
            case excludeReason = "excludeReason"
            case item = "item"
            case referenceId = "referenceId"
        }
    }

    public struct UpdateResiliencyPolicyRequest: AWSEncodableShape {
        /// Specifies a high-level geographical location constraint for where your resilience policy data can be stored.
        public let dataLocationConstraint: DataLocationConstraint?
        /// Resiliency policy to be created, including the recovery time objective (RTO) and recovery point objective (RPO) in seconds.
        public let policy: [DisruptionType: FailurePolicy]?
        /// Amazon Resource Name (ARN) of the resiliency policy. The format for this ARN is:
        /// arn:partition:resiliencehub:region:account:resiliency-policy/policy-id. For more information about ARNs,
        /// see  Amazon Resource Names (ARNs) in the  Amazon Web Services General Reference guide.
        public let policyArn: String
        /// Description of the resiliency policy.
        public let policyDescription: String?
        /// Name of the resiliency policy.
        public let policyName: String?
        /// The tier for this resiliency policy, ranging from the highest severity (MissionCritical) to lowest (NonCritical).
        public let tier: ResiliencyPolicyTier?

        @inlinable
        public init(dataLocationConstraint: DataLocationConstraint? = nil, policy: [DisruptionType: FailurePolicy]? = nil, policyArn: String, policyDescription: String? = nil, policyName: String? = nil, tier: ResiliencyPolicyTier? = nil) {
            self.dataLocationConstraint = dataLocationConstraint
            self.policy = policy
            self.policyArn = policyArn
            self.policyDescription = policyDescription
            self.policyName = policyName
            self.tier = tier
        }

        public func validate(name: String) throws {
            try self.policy?.forEach {
                try $0.value.validate(name: "\(name).policy[\"\($0.key)\"]")
            }
            try self.validate(self.policyArn, name: "policyArn", parent: name, pattern: "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9/][A-Za-z0-9:_/+.-]{0,1023}$")
            try self.validate(self.policyDescription, name: "policyDescription", parent: name, max: 500)
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$")
        }

        private enum CodingKeys: String, CodingKey {
            case dataLocationConstraint = "dataLocationConstraint"
            case policy = "policy"
            case policyArn = "policyArn"
            case policyDescription = "policyDescription"
            case policyName = "policyName"
            case tier = "tier"
        }
    }

    public struct UpdateResiliencyPolicyResponse: AWSDecodableShape {
        /// The resiliency policy that was updated, including the recovery time objective (RTO) and recovery point objective (RPO) in seconds.
        public let policy: ResiliencyPolicy

        @inlinable
        public init(policy: ResiliencyPolicy) {
            self.policy = policy
        }

        private enum CodingKeys: String, CodingKey {
            case policy = "policy"
        }
    }
}

// MARK: - Errors

/// Error enum for Resiliencehub
public struct ResiliencehubErrorType: AWSErrorType {
    enum Code: String {
        case accessDeniedException = "AccessDeniedException"
        case conflictException = "ConflictException"
        case internalServerException = "InternalServerException"
        case resourceNotFoundException = "ResourceNotFoundException"
        case serviceQuotaExceededException = "ServiceQuotaExceededException"
        case throttlingException = "ThrottlingException"
        case validationException = "ValidationException"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize Resiliencehub
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// You don't have permissions to perform the requested operation. The user or role that is making the request must have at least one IAM permissions policy attached that grants the required permissions.
    public static var accessDeniedException: Self { .init(.accessDeniedException) }
    /// This exception occurs when a conflict with a previous successful write is detected. This generally occurs when the previous write did not have time to propagate to the host serving the current request. A retry (with appropriate backoff logic) is the recommended response to this exception.
    public static var conflictException: Self { .init(.conflictException) }
    /// This exception occurs when there is an internal failure in the Resilience Hub service.
    public static var internalServerException: Self { .init(.internalServerException) }
    /// This exception occurs when the specified resource could not be found.
    public static var resourceNotFoundException: Self { .init(.resourceNotFoundException) }
    /// This exception occurs when you have exceeded your service quota. To perform the requested action, remove some of the relevant resources, or use Service Quotas to request a service quota increase.
    public static var serviceQuotaExceededException: Self { .init(.serviceQuotaExceededException) }
    /// This exception occurs when you have exceeded the limit on the number of requests per second.
    public static var throttlingException: Self { .init(.throttlingException) }
    /// This exception occurs when a request is not valid.
    public static var validationException: Self { .init(.validationException) }
}

extension ResiliencehubErrorType: AWSServiceErrorType {
    public static let errorCodeMap: [String: AWSErrorShape.Type] = [
        "ConflictException": Resiliencehub.ConflictException.self,
        "ResourceNotFoundException": Resiliencehub.ResourceNotFoundException.self,
        "ThrottlingException": Resiliencehub.ThrottlingException.self
    ]
}

extension ResiliencehubErrorType: Equatable {
    public static func == (lhs: ResiliencehubErrorType, rhs: ResiliencehubErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension ResiliencehubErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
